home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / util / boot / Blazewcp.lha / blazewcp.s < prev    next >
Text File  |  2002-05-22  |  48KB  |  3,197 lines

  1.  
  2.  
  3.     include 'lvo/exec_lib.i'
  4.     include 'lvo/graphics_lib.i'
  5.     include 'lvo/dos_lib.i'
  6.     include 'lvo/layers_lib.i'
  7.     include 'exec/execbase.i'
  8.     include 'exec/memory.i'
  9.     include 'exec/libraries.i'
  10.     include 'graphics/gfx.i'
  11.     include 'graphics/clip.i'
  12.     include 'graphics/rastport.i'
  13.     include 'utility/hooks.i'
  14.     include 'blazec2p.i'
  15.  
  16.     ;1.45/1.5
  17.     ; - added more efficient 16bit swap
  18.     ; - fixed masked 4bit rp routine
  19.     ; - made patch install more multitasking friendly
  20.     ;
  21.     ;1.55
  22.     ; - combined temp/dest bitmap build loops
  23.     ;
  24.     ;1.56
  25.     ; - Added conversion code just for non-aligned stuff.
  26.     ; - This gets rid of the temp planes on the stack and
  27.     ;     all the startup code that went into building them.
  28.     ; - Still have to leave it in tho, for masked crap
  29.     ;     but now non-aligned blits go to 11 ;)
  30.     ; - Fixed masked rp code since combining temp/dest loops
  31.     ;     broke it.
  32.     ;
  33.     ;1.65
  34.     ; - Fixed new non-aligned code. It read everything from the bitmap,masked
  35.     ;   or'd and then wrote back into the bitmap which doesn't work on interleaved
  36.     ;   bitmaps that are 16 pixels wide or smaller (doh!!!!)
  37.     ;
  38.     ;1.67
  39.     ; - streamlined convertion loops for all combinations of F/M/L conversions.
  40.     ; - inlined DoHookClipRects(), should now work from OS 2.04 on.
  41.     ;
  42.     ;1.7
  43.     ; - reworked stack/reg usage, eeked a bit more speed out
  44.     ; - reworked merge ops for 1/2/3/5/6/7 plane c2p to drop unused data
  45.     ;   instead of preserving it like the original merges did.
  46.     ;
  47.     ;1.73
  48.     ; - Moved code from the main loops to the BlitChunky routine, saved some space
  49.     ;   from redundant code.
  50.     ; - Patch now only builds a temp bitmap on the stack when operating on a masked rp.
  51.     ;   This saves 64 bytes of stack that gets wasted 99% of the time since it's not used.
  52.     ; - Now regular code stores data in parts of the stack only used by masked rp routine
  53.     ;   which saves having to save/restore registers, which is a little faster.
  54.     ; - steamlined some code to make it a little faster.
  55.     ;
  56.     ;1.74
  57.     ; - Now checks to see if unaligned blits are 32 pixels or smaller and allows them
  58.     ;   to stay unaligned if possible.  This is more efficient on small, non-aligned
  59.     ;   blits since it's the same # of chip-ram accesses but only 1 c2p instead of 2.
  60.     ;   Only tested on a 030 but should hold true for all 020+
  61.  
  62.     MACHINE 68030
  63.     OPT 3
  64.  
  65.  
  66.     SECTION text,code
  67.  
  68.     lea    (execbase,pc),a1
  69.     movea.l 4.w,a6
  70.     move.l    a6,(a1)
  71.     btst    #AFB_68020,(AttnFlags+1,a6)
  72.     beq.w    no020
  73.  
  74.     move.l    #endpatch-patch,d0
  75.     move.l    #MEMF_PUBLIC|MEMF_FAST|MEMF_REVERSE,d1
  76.     jsr    (_LVOAllocMem,a6)
  77.     lea    (newloc,pc),a1
  78.     move.l    d0,(a1)
  79.     beq.w    nomem
  80.  
  81.  
  82.     moveq    #39,d0
  83.     lea    (gfxname,pc),a1
  84.     jsr    (_LVOOpenLibrary,a6)          ; OpenLibrary
  85.     lea    (gfxbase,pc),a0
  86.     move.l    d0,(a0)
  87.     beq.b    nolibs
  88.  
  89.     move.l    #endpatch-patch,d0
  90.     lea    (patch,pc),a0
  91.     move.l    (newloc,pc),a1
  92.     jsr    (_LVOCopyMem,a6)
  93.  
  94.     jsr    (_LVOForbid,a6)
  95.  
  96.     movea.l (gfxbase,pc),a1
  97.     move.w    #_LVOWritePixelLine8,a0
  98.     move.l    (newloc,pc),d0
  99.     addq.l    #4,d0
  100.     jsr    (_LVOSetFunction,a6)
  101.  
  102.     movea.l (gfxbase,pc),a1
  103.     move.w    #_LVOWritePixelArray8,a0
  104.     move.l    (newloc,pc),d0
  105.     add.l    #NewWritePixelArray8-patch,d0
  106.     jsr    (_LVOSetFunction,a6)
  107.  
  108.     movea.l (gfxbase,pc),a1
  109.     cmp.w    #40,(LIB_VERSION,a1)
  110.     blt.b    noV40
  111.     move.w    #_LVOWriteChunkyPixels,a0
  112.     move.l    (newloc,pc),d0
  113.     add.l    #NewWriteChunkyPixels-patch,d0
  114.     jsr    (_LVOSetFunction,a6)
  115.  
  116. noV40    jsr    (_LVOCacheClearU,a6)
  117.     jsr    (_LVOPermit,a6)
  118.     moveq    #0,d0
  119.     rts
  120.     cnop    0,4
  121.  
  122.  
  123.  
  124. no020    moveq    #20,d0
  125.     rts
  126.  
  127. nomem    moveq    #10,d0
  128.     rts
  129.  
  130. nolibs    move.l    (newloc,pc),a1
  131.     move.l    #endpatch-patch,d0
  132.     jsr    (_LVOFreeMem,a6)
  133.     moveq    #30,d0
  134.     rts
  135.     cnop    0,4
  136.  
  137.  
  138. gfxname:
  139.     dc.b    'graphics.library',0
  140.     dc.b    '$VER: BlazeWCP 1.74 (22.05.2002) by Rick Pratt',0
  141.     cnop    0,4
  142. newloc
  143.     dc.l    0
  144.  
  145. patch
  146.     ; d0.w - xstart
  147.     ; d1.w - ystart
  148.     ; d2.w - width
  149.     ; a0.l - rp
  150.     ; a1.l - temprp
  151.     ; a2.l - array
  152.     ;
  153.     ; returns pixels ploted in d0
  154.     ;
  155.     dc.b    'BWCP'
  156.  
  157. NewWritePixelLine8
  158.     movem.l d2-d7/a2-a5,-(sp)
  159.     move.w    d2,d4
  160.     move.w    d1,d3
  161.     add.w    d0,d2
  162.     addi.w    #15,d4
  163.     subq.w    #1,d2
  164.     andi.w    #-16,d4
  165.     bra.b    WPx8
  166.     cnop    0,4
  167.  
  168.  
  169.     ; d0.w - xstart
  170.     ; d1.w - ystart
  171.     ; d2.w - xstop
  172.     ; d3.w - ystop
  173.     ; a0.l - rp
  174.     ; a1.l - temprp
  175.     ; a2.l - array
  176.     ;
  177.     ; returns pixels plotted in d0
  178.     ;
  179.     dc.b    'BWCP'
  180.  
  181. NewWritePixelArray8
  182.     movem.l d2-d7/a2-a5,-(sp)
  183.     move.w    d2,d4
  184.     moveq    #-16,d5
  185.     sub.w    d0,d4
  186.     sub.w    d5,d4    ; d4-(-16)=d4+16  or (xstop-xstart+1)+15
  187.     and.w    d5,d4
  188.     bra.b    WPx8
  189.     cnop    0,4
  190.  
  191.  
  192.     ; d0 - xstart
  193.     ; d1 - ystart
  194.     ; d2 - xstop
  195.     ; d3 - ystop
  196.     ; d4 - bytesperrow
  197.     ; a0 - rp
  198.     ; a2 - array
  199.     ;
  200.     ; returns nothing
  201.     ;
  202.     dc.b    'BWCP'
  203.  
  204. NewWriteChunkyPixels
  205.     movem.l d2-d7/a2-a5,-(sp)
  206.     ;
  207.     ; Make Rectangle on stack (see graphics/gfx.h for structure)
  208.     ; save ystop
  209.     ; save xstop
  210.     ; save ystart
  211.     ; save xstart    { (sp) = Rect }
  212.     ;
  213. WPx8    movem.w d0-d3,-(sp)
  214.  
  215.     move.l    sp,d6
  216.  
  217.     sub.w    d0,d2
  218.     clr.l    -(sp)
  219.     addq.w    #1,d2
  220.     movem.w d0/d1/d2/d4,-(sp)
  221.     move.l    a2,-(sp)      ; save array      { (sp) = data, (12,sp) = Rect }
  222.     ;12 - # pixels plotted
  223.     ;10 - width of chunky data
  224.     ;8  - xstop-xstart+1       ; width  of blit
  225.     ;6  - ystart
  226.     ;4  - xstart
  227.     ;0  - array
  228.     ;
  229.     movea.l a0,a1        ; get rastport
  230.  
  231.     move.l    sp,d7         ; get h_Data
  232.     movea.l (a1),d4      ; d4 = rp->rp_Layer
  233.     BNE.B    have_layer   ; nope, branch
  234.  
  235.     moveq    #0,d0
  236.     movea.l d6,a4         ; rect
  237.     MOVE    (2,a4),d0    ;
  238.     move.l    d0,-(sp)     ; offsety
  239.     movea.l a1,a2         ; rp
  240.     MOVE    (a4),d0      ;
  241.     move.l    d0,-(sp)     ; offsetx
  242.     move.l    (4,a4),-(sp) ; bounds
  243.     move.l    (a4),-(sp)   ; bounds
  244.     move.l    d4,-(sp)     ; layer
  245.     movea.l sp,a1         ; pass message
  246.     bsr.w    HookFunc
  247.     move.l    (32,sp),d0
  248.     lea    (44,sp),sp
  249.     move.l    (gfxbase,pc),a6    ; get GfxBase
  250.     movem.l (sp)+,d2-d7/a2-a5
  251.     rts
  252.     cnop    0,4
  253.  
  254. gfxbase     dc.l    0
  255. execbase    dc.l    0
  256.  
  257.  
  258. have_layer
  259.     move.l    a1,d5        ; save rp
  260.     CLR.L    (a1)+        ; clear rp->rp_layer
  261.     move.l    (a1),-(sp)  ; save rp->rp_BitMap
  262.     move.l    d4,a2        ;
  263.     SUBQ.L    #8,sp        ; reserve space
  264.     move.l    (execbase,pc),a6
  265.  
  266.     lea    (lr_Lock,a2),a0
  267.     jsr    (_LVOObtainSemaphore,a6)
  268.     MOVE    (lr_MinX,a2),d2      ;lr_MinX
  269.     SUB    (lr_Scroll_X,a2),d2  ;lr_Scroll_X
  270.     MOVE    (lr_MinY,a2),d3      ;lr_MinY
  271.     SUB    (lr_Scroll_Y,a2),d3  ;lr_Scroll_Y
  272.     movea.l sp,a1
  273.     movea.l d6,a0
  274.     move.l    d6,-(sp)    ; is rect NULL ?
  275.     BEQ.B    NRec        ; yep, branch
  276.     move.l    a1,d6
  277.     MOVE    (a0)+,d0
  278.     ADD    d2,d0       ; ra_MinX + boundsX
  279.     MOVE    d0,(a1)+
  280.     MOVE    (a0)+,d0
  281.     ADD    d3,d0       ; ra_MinY + boundsY
  282.     MOVE    d0,(a1)+
  283.     MOVE    (a0)+,d0
  284.     ADD    d2,d0       ; ra_MaxX + boundsX
  285.     MOVE    d0,(a1)+
  286.     MOVE    (a0)+,d0
  287.     ADD    d3,d0       ; ra_MaxY + boundsY
  288.     MOVE    d0,(a1)+
  289. NRec    LEA    (lr_ClipRect,a2),a5  ; lr_ClipRect
  290.     SUBQ.L    #8,sp
  291.  
  292.  
  293.     ; for BitMaps/ClipRects
  294.     ;
  295.     ;
  296.     ;
  297.     ;
  298. Rend_cr move.l    (a5),d0       ; lr_ClipRect = 0
  299.     BEQ    Rend_Super_cr ; yep, try SuperClipRects
  300.     movea.l d0,a5
  301.     LEA    (cr_MinX,a5),a4 ; cr_MinX
  302.     TST.L    d6
  303.     BEQ.B    cr_NoRect
  304.     movea.l d6,a1
  305.     movea.l sp,a2
  306.     move.l    (a4)+,d0   ; cr_MinX/cr_MinY
  307.     move.l    (a1)+,d1   ; rect minX/MinY
  308.     cmp.l    d0,d1
  309.     ble.b    10$
  310.     exg    d0,d1
  311. 10$    cmp.w    d0,d1
  312.     ble.b    20$
  313.     move.w    d1,d0
  314. 20$    move.l    d0,(a2)+
  315.     move.l    (a4)+,d0   ; cr_MaxX/cr_MaxY
  316.     move.l    (a1)+,d1   ; rect maxX/maxY
  317.     cmp.l    d0,d1
  318.     bge.b    30$
  319.     exg    d0,d1
  320. 30$    cmp.w    d0,d1
  321.     bge.b    40$
  322.     move.w    d1,d0
  323. 40$    move.l    d0,(a2)
  324.     move.l    -(a2),d1
  325.     CMP    d1,d0
  326.     BLT.B    Rend_cr
  327.     CMP.L    d1,d0
  328.     BLT.B    Rend_cr
  329.     movea.l sp,a4
  330.  
  331. cr_NoRect
  332.     movea.l d5,a2         ; RastPort
  333.     TST.L    (cr_lobs,a5) ; cr_lobs
  334.     BNE.B    cr_Lobs
  335.     moveq    #0,d0
  336.     MOVE    (2,a4),d0    ;
  337.     SUB    d3,d0         ;
  338.     move.l    d0,-(sp)     ; offsety
  339.     MOVE    (a4),d0      ;
  340.     SUB    d2,d0         ;
  341.     move.l    d0,-(sp)     ; offsetx
  342.     move.l    (4,a4),-(sp) ; bounds
  343.     move.l    (a4),-(sp)   ; bounds
  344.     move.l    d4,-(sp)     ; layer
  345.     movea.l sp,a1         ; pass message
  346.     movem.l d2-d7/a5,-(sp)
  347.     bsr.w    HookFunc
  348.     movem.l (sp)+,d2-d7/a5
  349.     LEA    (20,sp),sp
  350.     bra.b    Rend_cr
  351.     cnop    0,4
  352.  
  353.  
  354.  
  355.       ; for ClipRects with lobs
  356.       ;
  357.       ; a0 = Hook
  358.       ; a1 = layer
  359.       ; a2 = RastPort
  360.       ; a4 = current rect
  361.       ; a5 = ClipRect
  362.       ;
  363. cr_Lobs TST.L    (cr_BitMap,a5)           ; cr_BitMap
  364.     BEQ.B    Rend_cr      ; cliprect has no bitmap
  365.     moveq    #15,d1
  366.     move.w    (cr_MinX,a5),d0  ; cr_MinX
  367.     and.w    d0,d1         ; 15 & cr_MinX
  368.     sub.w    d0,d1         ; (15 & cr_MinX)-cr_MinX
  369.     move.l    (4,a4),d0     ; MaxX,MaxY
  370.     swap    d1
  371.     add.l    d1,d0         ; MaxX+((15 & cr_MinX)-cr_MinX) , MaxY
  372.     sub.w    (cr_MinY,a5),d0  ; MaxX+((15 & cr_MinX)-cr_MinX) , MaxY-cr_MinY
  373.     move.l    d0,-(sp)
  374.     add.l    (a4),d1      ; MinX+((15 & cr_MinX)-cr_MinX) , MinY
  375.     SUB    (cr_MinY,a5),d1  ; MinX+((15 & cr_MinX)-cr_MinX) , MinY-cr_MinY
  376.     move.l    d1,-(sp)
  377.     movea.l sp,a3
  378.     move.l    (rp_BitMap,a2),a6          ; save rp_BitMap
  379.     move.l    (cr_BitMap,a5),(rp_BitMap,a2) ; cr_BitMap -> rp_BitMap
  380.     moveq    #0,d0
  381.     MOVE    (2,a4),d0    ; MinY
  382.     SUB    d3,d0         ;
  383.     move.l    d0,-(sp)     ; offsety
  384.     MOVE    (a4),d0      ; MinX
  385.     SUB    d2,d0         ;
  386.     move.l    d0,-(sp)     ; offsetx
  387.     move.l    (4,a3),-(sp) ; bounds MaxX+((15 & cr_MinX)-cr_MinX) ,MaxY-cr_MaxY
  388.     move.l    (a3),-(sp)   ; bounds MinX+((15 & cr_MinX)-cr_MinX) ,MinY-cr_MinY
  389.     move.l    d4,-(sp)     ;
  390.     movea.l sp,a1         ; pass message
  391.     movem.l d2-d7/a2/a5-a6,-(sp)
  392.     bsr.w    HookFunc
  393.     movem.l (sp)+,d2-d7/a2/a5-a6
  394.     LEA    (28,sp),sp
  395.     move.l    a6,(rp_BitMap,a2)    ; restore rp_BitMap
  396.     BRA    Rend_cr
  397.     cnop    0,4
  398.  
  399. QuitDHCR:
  400.     ADDQ.L    #8,sp
  401.     movea.l d5,a0
  402.     move.l    (sp)+,(rp_BitMap,a0)  ; rp_BitMap
  403.     move.l    d4,(a0)
  404.     movea.l d4,a0
  405.     move.l    (execbase,pc),a6
  406.     lea    (lr_Lock,a0),a0
  407.     jsr    (_LVOReleaseSemaphore,a6)
  408.     move.l    (32-20,sp),d0
  409.     lea    (44-20,sp),sp
  410.     move.l    (gfxbase,pc),a6    ; get GfxBase
  411.     movem.l (sp)+,d2-d7/a2-a5
  412.     rts
  413.     cnop    0,4
  414.  
  415.  
  416.     ; for SuperBitMaps/SuperClipRects
  417.     ;
  418.     ;
  419.     ; a2 = Layer
  420.     ; a5 = ClipRect
  421.     ;
  422. Rend_Super_cr
  423.     ADDQ.L    #8,sp
  424.     move.l    (sp)+,d6
  425.     movea.l d4,a2        ; restore layer to a2.
  426.     move.l    (lr_SuperBitMap,a2),d0    ; lr_SuperBitMap
  427.     BEQ.B    QuitDHCR    ; nope, quit
  428.     movea.l d5,a0        ; restore rastport
  429.     move.l    d0,(rp_BitMap,a0)   ; lr_SuperBitMap -> rp_BitMap
  430.     LEA    (lr_SuperClipRect,a2),a5  ; lr_SuperClipRect
  431.  
  432.  
  433.     ;
  434.     ; This section loops thru SuperClipRects, calls the hook
  435.     ;  if needed and quits when done.
  436.  
  437. Super_cr
  438.     move.l    (a5),d0     ; lr_SuperClipRect = null
  439.     BEQ.B    QuitDHCR    ; yep, quit
  440.     movea.l d0,a5
  441.     LEA    (cr_MinX,a5),a4  ; cr_MinX
  442.     TST.L    d6        ; rect = null
  443.     BEQ.B    50$        ; yep, so just go do it
  444.     movea.l d6,a1
  445.     movea.l sp,a2
  446.     move.l    (a4)+,d0    ; This is the SuperClipRects rect
  447.     move.l    (a1)+,d1    ; This is what we passed.
  448.     cmp.l    d0,d1
  449.     ble.b    10$
  450.     exg    d0,d1
  451. 10$    cmp.w    d0,d1
  452.     ble.b    20$
  453.     move.w    d1,d0
  454. 20$    move.l    d0,(a2)+
  455.     move.l    (a4)+,d0
  456.     move.l    (a1)+,d1
  457.     cmp.l    d0,d1
  458.     bge.b    30$
  459.     exg    d0,d1
  460. 30$    cmp.w    d0,d1
  461.     bge.b    40$
  462.     move.w    d1,d0
  463. 40$    move.l    d0,(a2)
  464.     move.l    -(a2),d1
  465.     CMP    d1,d0
  466.     BLT.B    Super_cr
  467.     CMP.l    d1,d0
  468.     BLT.B    Super_cr
  469.     movea.l sp,a4
  470. 50$    movea.l d5,a2
  471.     moveq    #0,d0         ; this does the hook
  472.     MOVE    (2,a4),d0    ;
  473.     move.l    d0,-(sp)     ; offsety
  474.     MOVE    (a4),d0      ;
  475.     move.l    d0,-(sp)     ; offsetx
  476.     move.l    (4,a4),-(sp) ; bounds
  477.     move.l    (a4),-(sp)   ; bounds
  478.     move.l    d4,-(sp)     ; layer
  479.     movea.l sp,a1         ; pass message
  480.     movem.l d4-d7/a5,-(sp)
  481.     bsr.b    HookFunc
  482.     movem.l (sp)+,d4-d7/a5
  483.     LEA    (20,sp),sp
  484.     bra.b    Super_cr
  485.     cnop    0,4
  486.  
  487.  
  488.  
  489.  
  490.  
  491. HookFunc:   ; a0 = Hook, a1 = message [layer, bounds, offsetx, offsety], a2 = RastPort
  492.     moveq    #stacked,d1
  493.     suba.l    d1,sp
  494.     movea.l d7,a6           ;(h_Data,a0),a6  ; a6 = Hook->h_Data (16)
  495.     movea.l (rp_BitMap,a2),a4    ; a4 = BitMap
  496.     move.l    a2,a5
  497.     move.b    (bm_Depth,a4),d5    ; d5 = BitMap->Depth
  498.     beq.w    crap_c2p
  499.     cmpi.b    #9,d5
  500.     bge.w    crap_c2p
  501.     move.w    (a4),d1   ;(bm_BytesPerRow,a4),d1
  502.     move.l    d1,(DBPR,sp)
  503.     extb.l    d5
  504.     moveq    #31,d7
  505.  
  506.  
  507.     ;
  508.     ;
  509.     ; This code generates height, width area and chunky displacement
  510.     ;
  511.     ;
  512.     movea.l a1,a3        ; a3 = message
  513.     move.w    (4,a6),a2   ; a2 = xstart      4,a6
  514.     move.l    (12,a1),d1  ; d1 = offsetx
  515.     sub.l    a2,d1        ;     = offsetx-xstart
  516.     move.w    (6,a6),a2   ; a2 = ystart      6,a6
  517.     move.l    (16,a1),d2  ; d2 = offsety
  518.     sub.l    a2,d2        ;     = offsety-ystart
  519.     muls.w    (10,a6),d2  ; d2 = (chunky BytesPerRow)*(offsety-ystart) 10,a6
  520.     movea.l (a6),a2     ; a2 = pointer to array
  521.     adda.l    d2,a2        ; a2 = array + ((chunky BytesPerRow)*(offsety-ystart))
  522.     adda.l    d1,a2        ; a2 = (array+((chunky BytesPerRow)*(offsety-ystart))) + (xoffset-xstart)
  523.     addq.l    #4,a1
  524.     ;
  525.     ;    d2 = Actual # of pixel wide
  526.     ;
  527.     move.w    (a1)+,d0    ; d0 = MinX
  528.     moveq    #0,d2
  529.     move.w    (8,a3),d2   ; d2 = MaxX
  530.     sub.w    d0,d2        ; d2 = MaxX-MinX
  531.     addq.w    #1,d2        ; d2 = (MaxX-MinX)+1
  532.     ;
  533.     ;    d1 = Actual # of pixels high
  534.     ;
  535.     moveq    #0,d1
  536.     move.w    (10,a3),d1  ; d1 = MaxY
  537.     sub.w    (a1)+,d1    ; d1 = MaxY-MinY
  538.     addq.w    #1,d1        ; d1 = (MaxY-MinY)+1
  539.  
  540.  
  541.     move.l    d2,d3
  542.     muls.w    d1,d3
  543.     add.l    d3,(12,a6)  ; this WILL make it give the correct # of pixels plotted
  544.     ;
  545.     ;
  546.     ; The code below calculates how the bitmap is aligned and builds masks, etc...
  547.     ;
  548.     ;
  549.     move.w    d1,(Lines,sp)
  550.     moveq    #32,d4        ; d4 = 32
  551.     sub.w    d0,d4        ; d4 = 32-MinX
  552.     and.l    d7,d4        ; d4 = (32-MinX) & $0000001f  shift into 1st LW
  553.     move.w    (a1),d0     ; d0 = MaxX
  554.     addq.w    #1,d0        ; d0 = MaxX+1
  555.     and.l    d7,d0        ; d0 = (MaxX+1) & $0000001f shift into last LW
  556.     moveq    #32,d1        ; d1 = 32
  557.     sub.l    d4,d1        ; d1 = 32-( (32-MinX)&31 ) amount of data in 1st LW
  558.     moveq    #-1,d3
  559.     lsr.l    d1,d3        ; d3 = -1>>32-((32-MinX)&31) start mask
  560.     moveq    #32,d1        ; d1 = 32
  561.     sub.l    d0,d1        ; d1 = 32-((MaxX+1) & 31)
  562.     move.l    d3,(FLWmask,sp) ; firstword mask save d3
  563.     moveq    #-1,d3
  564.     lsl.l    d1,d3        ; d1 = -1 << by 32-((MaxX+1) & 31)
  565.     moveq    #0,d6
  566.     move.w    (10,a6),a6    ;(HData,sp)
  567.     move.w    (6,a3),d6
  568.     add.w    (4,a3),d7
  569.     muls.w    (a4),d6
  570.     lsr.l    #5,d7
  571.     lsl.l    #2,d7
  572.     add.l    d7,d6
  573.  
  574.     move.l    d5,d7
  575.     subq.l    #1,d7
  576.     ;
  577.     ;
  578.     ;
  579.     ;    Code builds inital pointers into temp/dest bitmap
  580.     ;
  581. DispBuild
  582.     movea.l (8,a4,d7.l*4),a1
  583.     adda.l    d6,a1
  584.     move.l    a1,(DP0point,sp,d7.l*4)
  585.     dbf    d7,DispBuild
  586.  
  587.  
  588.     moveq    #-1,d7
  589.     lsl.b    d5,d7          ; mask for how many planes we are using
  590.     not.l    d7
  591.     move.b    (rp_Mask,a5),d6 ; rp_Mask & #plane mask gives mask for this op
  592.     and.b    d7,d6          ; just in case the mask has more bits then planes
  593.     subq.w    #1,d5
  594.     cmp.b    d7,d6          ; we need
  595.     bne.w    Masked_rp
  596.  
  597.  
  598.     ;d2 = (MaxX-MinX)+1    blitwidth
  599.     ;d4 = 32-(32-MinX)&31)    amount of data in 1st LW
  600. NotMasked
  601.     move.w    d5,(NLWblit,sp)
  602.     cmp.w    d4,d2           ; blitwidth-(amount in 1st LW)
  603.     bgt.b    multiLW        ; convertion larger then then 1 lw, blit goes beyond 1st lw
  604.     move.l    (FLWmask,sp),d6
  605.     tst    d0           ; end of convertion bit
  606.     beq.b    blF           ; ends at 32bit bound
  607.     and.l    d3,d6           ; blit smaller then 1st lw
  608.  
  609. blF
  610.     move.w    #-4,a5
  611. blF2    lea    (-32,a2,d4.l),a0
  612.     lea    (-32,a6),a6
  613.     bra.b    30$
  614.     cnop    0,4
  615.  
  616. 10$    lea    (DBPR,sp),a3
  617.     move.w    d5,d7
  618.     move.l    (a3)+,d0
  619. 20$    add.l    d0,(a3)+
  620.     dbf    d7,20$
  621.     adda.w    a6,a0
  622. 30$    bsr.w    AlignChunky
  623.     subq.w    #1,(Lines,sp)
  624.     bgt.b    10$
  625.     lea    (stacked,sp),sp
  626.     rts
  627.     cnop    0,4
  628.  
  629.  
  630. multiLW
  631.     sub.w    d4,d2
  632.     sub.w    d0,d2        ; (width-start)-end=remaining conversion size
  633.     andi.w    #-32,d2
  634.     bne.w    LW1
  635.     tst.w    d4        ; no middle  x0x
  636.     bne.b    blFL
  637.     suba.l    a5,a5           ; last LW
  638.     lea    (-32,a6),a6
  639.     move.l    a2,a0
  640.     move.l    d3,d6
  641.     bra.b    30$
  642.     cnop    0,4
  643.  
  644. 10$    lea    (DBPR,sp),a3
  645.     move.w    d5,d7
  646.     move.l    (a3)+,d0
  647. 20$    add.l    d0,(a3)+
  648.     dbf    d7,20$
  649.     adda.w    a6,a0
  650. 30$    bsr.w    AlignChunky
  651.     subq.w    #1,(Lines,sp)
  652.     bgt.b    10$
  653.     lea    (stacked,sp),sp
  654.     rts
  655.     cnop    0,4
  656.  
  657. blFL    moveq    #16,d2
  658.     cmp.l    d2,d4      ;head
  659.     bgt.b    5$
  660.     cmp.l    d2,d0      ;tail
  661.     bgt.b    5$
  662.     suba.l    a5,a5
  663.     add.l    d2,d4
  664.     or.l    (FLWmask,sp),d3
  665.     subq.l    #2,a5
  666.     swap    d3
  667.     move.l    d3,d6
  668.     bra.b    blF2
  669.     cnop    0,4
  670.  
  671. 5$    add.l    d2,d2
  672.     moveq    #-8,d1
  673.     move.l    d4,d7
  674.     addq.l    #7,d0
  675.     and.l    d1,d0    ;tail
  676.     add.l    d0,d7
  677.     cmp.l    d2,d7
  678.     bgt.b    6$
  679.     add.l    d0,d4
  680.     or.l    (FLWmask,sp),d3
  681.     rol.l    d0,d3
  682.     lsr.l    #3,d0
  683.     move.l    d0,a5
  684.     subq.l    #4,a5
  685.     move.l    d3,d6
  686.     bra.b    blF2
  687.     cnop    0,4
  688.  
  689.  
  690.  
  691. 6$    lea    (-32,a2,d4.l),a0
  692.     lea    (-64,a6),a6
  693.     move.w    a6,(sp)
  694.     move.l    d3,a6        ;llwm
  695.     move.l    (FLWmask,sp),d6 ;flwm
  696.     move.w    #-4,a5
  697.     bra.b    30$
  698.     cnop    0,4
  699.  
  700. 10$    lea    (DBPR,sp),a3
  701.     move.w    d5,d7
  702.     move.l    (a3)+,d0
  703. 20$    add.l    d0,(a3)+
  704.     dbf    d7,20$
  705.     adda.w    (sp),a0 ;(HData,sp),a0
  706.     exg    a6,d6
  707.     subq.l    #4,a5
  708. 30$    bsr.w    AlignChunky
  709.     exg    a6,d6
  710.     suba.l    a5,a5
  711.     bsr.w    AlignChunky
  712.     subq.w    #1,(Lines,sp)
  713.     bgt.b    10$
  714.     lea    (stacked,sp),sp
  715.     rts
  716.     cnop    0,4
  717.  
  718.  
  719. LW1    sub.w    d2,a6
  720.     move.w    d2,(BWidth,sp)
  721.     tst.w    d4        ; middle  x1x
  722.     bne.b    LW3
  723.     move.l    a2,a0
  724.     tst.w    d0        ; no head, middle 01x
  725.     bne.b    blML        ; no head, middle,tail 011
  726.     move.w    a6,(sp)
  727.     bra.b    30$
  728.     cnop    0,4
  729.  
  730. 10$    lea    (DBPR,sp),a3
  731.     move.w    d5,d7
  732.     move.l    (a3)+,d0
  733. 20$    add.l    d0,(a3)+
  734.     dbf    d7,20$
  735.     adda.w    (sp),a0
  736. 30$    bsr    BlitChunky
  737.     subq.w    #1,(Lines,sp)
  738.     bgt.b    10$
  739.     lea    (stacked,sp),sp
  740.     rts
  741.     cnop    0,4
  742.  
  743. blML    lea    (-32,a6),a6
  744.     lsr.w    #3,d2
  745.     move.l    d3,(LLWmask,sp)
  746.     move.w    d2,(EndBit,sp)
  747.     move.w    a6,(sp)
  748.     bra.b    30$
  749.     cnop    0,4
  750.  
  751. 10$    lea    (DBPR,sp),a3
  752.     move.w    d5,d7
  753.     move.l    (a3)+,d0
  754. 20$    add.l    d0,(a3)+
  755.     dbf    d7,20$
  756.     adda.w    (sp),a0
  757. 30$    bsr    BlitChunky
  758.     move.l    (LLWmask,sp),d6
  759.     move.w    (EndBit,sp),a5
  760.     bsr.w    AlignChunky
  761.     subq.w    #1,(Lines,sp)
  762.     bgt.b    10$
  763.     lea    (stacked,sp),sp
  764.     rts
  765.     cnop    0,4
  766.  
  767.  
  768.  
  769. LW3
  770.     lea    (-32,a2,d4.l),a0
  771.     tst.w    d0        ; head, middle      11x
  772.     beq.b    blFM        ; head, middle, tail 111
  773.     lea    (-64,a6),a6    ; FML, whole line
  774.     lsr.w    #3,d2
  775.     move.l    d3,(LLWmask,sp)
  776.     move.w    d2,(EndBit,sp)
  777.     move.w    a6,(sp)
  778.     bra.b    30$
  779.     cnop    0,4
  780.  
  781. 10$    lea    (DBPR,sp),a3
  782.     move.w    d5,d7
  783.     move.l    (a3)+,d0
  784. 20$    add.l    d0,(a3)+
  785.     dbf    d7,20$
  786.     adda.w    (sp),a0
  787. 30$    move.w    #-4,a5
  788.     move.l    (FLWmask,sp),d6
  789.     bsr.w    AlignChunky
  790.     bsr.b    BlitChunky
  791.     move.l    (LLWmask,sp),d6
  792.     move.w    (EndBit,sp),a5
  793.     bsr.w    AlignChunky
  794.     subq.w    #1,(Lines,sp)
  795.     bgt.b    10$
  796.  
  797. crap_c2p
  798.     lea    (stacked,sp),sp
  799.     rts
  800.     cnop    0,4
  801.  
  802. blFM    lea    (-32,a6),a6
  803.     move.w    a6,(sp)
  804.     bra.b    30$
  805.     cnop    0,4
  806.  
  807. 10$    lea    (DBPR,sp),a3
  808.     move.w    d5,d7
  809.     move.l    (a3)+,d0
  810. 20$    add.l    d0,(a3)+
  811.     dbf    d7,20$
  812.     adda.w    (sp),a0
  813. 30$    move.w    #-4,a5
  814.     move.l    (FLWmask,sp),d6
  815.     bsr.w    AlignChunky
  816.     bsr.b    BlitChunky
  817.     subq.w    #1,(Lines,sp)
  818.     bgt.b    10$
  819.     lea    (stacked,sp),sp
  820.     rts
  821.     cnop    0,4
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.     ;
  830.     ;
  831.     ; This is the heart of the patch, the C2P routines
  832.     ;
  833.     ;
  834.     ; all C2P code after this
  835.  
  836. BlitChunky:
  837.     ;  d0-d7/a1-a6 trashed
  838.     ; d0 = width/32
  839.     ; d5 = depth
  840.     ; a0 = chunky src
  841.     ;
  842.     ;
  843.     move.w    (BWidth+4,sp),a5
  844.     add.l    a0,a5
  845.     move.w    (.jmp,pc,d5.w*2),d0
  846.     move.l    #$33333333,d5
  847.     move.l    #$55555555,d6
  848.     jmp    (.jmp,pc,d0.w)
  849.     cnop    0,4
  850. .jmp
  851.     dc.w    con1p32-.jmp   ; 1 plane
  852.     dc.w    con2p32-.jmp   ; 2 planes
  853.     dc.w    con3p32-.jmp   ; 3 planes
  854.     dc.w    con4p32-.jmp   ; 4 planes
  855.     dc.w    con5p32-.jmp   ; 5 planes
  856.     dc.w    con6p32-.jmp   ; 6 planes
  857.     dc.w    con7p32-.jmp   ; 7 planes
  858.     dc.w    con8p32-.jmp   ; 8 planes
  859.     cnop    0,4
  860.  
  861.  
  862. con4p32
  863.     movem.l (DP0point+4,sp),a1-a4
  864.     move.l    #$0F0F0F0F,d4
  865.     move.l    (a0)+,d0
  866.     move.l    (a0)+,d2
  867.     move.l    (a0)+,d1
  868.     move.l    (a0)+,d3
  869.  
  870.     and.l    d4,d0
  871.     and.l    d4,d1
  872.     lsl.l    #4,d0
  873.     lsl.l    #4,d1
  874.     and.l    d4,d2
  875.     and.l    d4,d3
  876.     or.l    d2,d0
  877.     or.l    d3,d1
  878.  
  879.     move.l    d4,d2
  880.     move.l    d4,d3
  881.     move.l    d4,d7
  882.     and.l  (a0)+,d2
  883.     and.l  (a0)+,d4
  884.     and.l  (a0)+,d3
  885.     and.l  (a0)+,d7
  886.     lsl.l    #4,d2
  887.     lsl.l    #4,d3
  888.     or.l    d4,d2
  889.     or.l    d7,d3
  890.  
  891.     move.l    d2,d7
  892.     move.l    d3,d4
  893.     move.w    d0,d2
  894.     move.w    d1,d3
  895.     swap    d2
  896.     swap    d3
  897.     move.w    d2,d0
  898.     move.w    d3,d1
  899.     move.w    d7,d2
  900.     move.w    d4,d3
  901.     bra.b    c4p32_2
  902.     cnop    0,4
  903.  
  904.  
  905. c4p32_1
  906.     move.l    d2,a6
  907.     move.l    (a0)+,d0
  908.     move.l    (a0)+,d2
  909.     move.l    (a0)+,d1
  910.     move.l    (a0)+,d3
  911.  
  912.     move.l    d4,(a1)+ ;p0
  913.  
  914.     move.l    #$0F0F0F0F,d4
  915.     and.l    d4,d0
  916.     and.l    d4,d1
  917.     lsl.l    #4,d0
  918.     lsl.l    #4,d1
  919.     and.l    d4,d2
  920.     and.l    d4,d3
  921.     or.l    d2,d0
  922.     or.l    d3,d1
  923.     move.l    d4,d2
  924.     move.l    d4,d3
  925.  
  926.     and.l  (a0)+,d2
  927.     and.l  (a0)+,d3
  928.     lsl.l    #4,d2
  929.     or.l    d3,d2
  930.     move.l    d4,d3
  931.     and.l  (a0)+,d3
  932.     and.l  (a0)+,d4
  933.  
  934.     move.l    d7,(a3)+ ;p2
  935.  
  936.     lsl.l    #4,d3
  937.     or.l    d4,d3
  938.     move.l    d2,d7
  939.     move.l    d3,d4
  940.     move.w    d0,d2
  941.     move.w    d1,d3
  942.     swap    d2
  943.     swap    d3
  944.     move.w    d2,d0
  945.     move.w    d3,d1
  946.     move.w    d7,d2
  947.     move.w    d4,d3
  948.  
  949.     move.l    a6,(a2)+ ;p1
  950.  
  951. c4p32_2 move.l    d2,d4
  952.     move.l    d3,d7
  953.     lsr.l    #2,d4
  954.     lsr.l    #2,d7
  955.     eor.l    d0,d4
  956.     eor.l    d1,d7
  957.     and.l    d5,d4
  958.     and.l    d5,d7
  959.     eor.l    d4,d0
  960.     eor.l    d7,d1
  961.     lsl.l    #2,d4
  962.     lsl.l    #2,d7
  963.     eor.l    d4,d2
  964.     eor.l    d7,d3
  965.  
  966.  
  967.     move.l    #$00ff00ff,d4
  968.  
  969.  
  970.     move.l    d1,d7
  971.     lsr.l    #8,d7
  972.     eor.l    d0,d7
  973.     and.l    d4,d7
  974.     eor.l    d7,d0
  975.     lsl.l    #8,d7
  976.     eor.l    d7,d1
  977.  
  978.  
  979.     move.l    d1,d7
  980.     lsr.l    #1,d7
  981.     eor.l    d0,d7
  982.     and.l    d6,d7
  983.     eor.l    d7,d0
  984.     add.l    d7,d7
  985.     eor.l    d1,d7
  986.  
  987.  
  988.     move.l    d0,(a4)+ ;p3
  989.  
  990.  
  991.     move.l    d3,d1
  992.     lsr.l    #8,d1
  993.     eor.l    d2,d1
  994.     and.l    d4,d1
  995.     eor.l    d1,d2
  996.     lsl.l    #8,d1
  997.     eor.l    d1,d3
  998.  
  999.  
  1000.     move.l    d3,d4
  1001.     lsr.l    #1,d4
  1002.     eor.l    d2,d4
  1003.     and.l    d6,d4
  1004.     eor.l    d4,d2
  1005.     add.l    d4,d4
  1006.     eor.l    d3,d4
  1007.  
  1008.  
  1009.     cmpa.l    a0,a5
  1010.     bgt.w    c4p32_1
  1011.  
  1012.     move.w    (NLWblit+4,sp),d5
  1013.     move.l    d2,(a2)  ;p1
  1014.     move.l    d7,(a3)  ;p2
  1015.     move.l    d4,(a1)  ;p0
  1016.  
  1017.     rts
  1018.     cnop    0,4
  1019.  
  1020.  
  1021. con3p32
  1022.  
  1023.     movem.l (DP0point+4,sp),a1-a3
  1024.     move.l    #$0F0F0F0F,d4
  1025.     move.l    (a0)+,d0
  1026.     move.l    (a0)+,d2
  1027.     move.l    (a0)+,d1
  1028.     move.l    (a0)+,d3
  1029.  
  1030.     and.l    d4,d0
  1031.     and.l    d4,d1
  1032.     lsl.l    #4,d0
  1033.     lsl.l    #4,d1
  1034.     and.l    d4,d2
  1035.     and.l    d4,d3
  1036.     or.l    d2,d0
  1037.     or.l    d3,d1
  1038.  
  1039.     move.l    d4,d2
  1040.     move.l    d4,d3
  1041.     move.l    d4,d7
  1042.     and.l  (a0)+,d2
  1043.     and.l  (a0)+,d4
  1044.     and.l  (a0)+,d3
  1045.     and.l  (a0)+,d7
  1046.     lsl.l    #4,d2
  1047.     lsl.l    #4,d3
  1048.     or.l    d4,d2
  1049.     or.l    d7,d3
  1050.     move.l    d2,d7
  1051.     move.l    d3,d4
  1052.     move.w    d0,d2
  1053.     move.w    d1,d3
  1054.     swap    d2
  1055.     swap    d3
  1056.     move.w    d2,d0
  1057.     move.w    d3,d1
  1058.     move.w    d7,d2
  1059.     move.w    d4,d3
  1060.     bra.b    c3p32_2
  1061.     cnop    0,4
  1062.  
  1063.  
  1064. c3p32_1
  1065.     movea.l d2,a4
  1066.     movea.l d3,a6
  1067.     move.l    (a0)+,d0
  1068.     move.l    (a0)+,d2
  1069.     move.l    (a0)+,d1
  1070.     move.l    (a0)+,d3
  1071.     move.l    #$0F0F0F0F,d4
  1072.     and.l    d4,d0
  1073.     and.l    d4,d1
  1074.     lsl.l    #4,d0
  1075.     lsl.l    #4,d1
  1076.     and.l    d4,d2
  1077.     and.l    d4,d3
  1078.     or.l    d2,d0
  1079.     or.l    d3,d1
  1080.  
  1081.     move.l    d4,d2
  1082.     move.l    d4,d3
  1083.     move.l    d4,d7
  1084.     and.l  (a0)+,d2
  1085.     and.l  (a0)+,d4
  1086.     and.l  (a0)+,d3
  1087.     and.l  (a0)+,d7
  1088.  
  1089.     move.l    a4,(a2)+ ;p1
  1090.  
  1091.     lsl.l    #4,d2
  1092.     or.l    d4,d2
  1093.     lsl.l    #4,d3
  1094.     or.l    d7,d3
  1095.     move.l    d2,d7
  1096.     move.l    d3,d4
  1097.     move.w    d0,d2
  1098.     move.w    d1,d3
  1099.     swap    d2
  1100.     swap    d3
  1101.     move.w    d2,d0
  1102.     move.w    d3,d1
  1103.     move.w    d7,d2
  1104.     move.w    d4,d3
  1105.  
  1106.     move.l    a6,(a1)+ ;p0
  1107.  
  1108.  
  1109. c3p32_2
  1110.     move.l    d2,d7
  1111.     move.l    d3,d4
  1112.     lsr.l    #2,d7
  1113.     lsr.l    #2,d4
  1114.     eor.l    d0,d7
  1115.     eor.l    d1,d4
  1116.     and.l    d5,d7
  1117.     and.l    d5,d4
  1118.     eor.l    d7,d0
  1119.     eor.l    d4,d1
  1120.     lsl.l    #2,d7
  1121.     lsl.l    #2,d4
  1122.     eor.l    d7,d2
  1123.     eor.l    d4,d3
  1124.  
  1125.     move.l    d1,d7
  1126.     move.l    #$00ff00ff,d4
  1127.     lsr.l    #8,d7
  1128.     eor.l    d0,d7
  1129.     and.l    d4,d7
  1130.     eor.l    d7,d0
  1131.     lsl.l    #8,d7
  1132.     eor.l    d1,d7
  1133.  
  1134.     and.l    d6,d0
  1135.     and.l    d6,d7
  1136.     add.l    d0,d0
  1137.     or.l    d0,d7
  1138.  
  1139.     move.l    d7,(a3)+ ;p2
  1140.  
  1141.     move.l    d3,d1
  1142.     lsr.l    #8,d1
  1143.     eor.l    d2,d1
  1144.     and.l    d4,d1
  1145.     eor.l    d1,d2
  1146.     lsl.l    #8,d1
  1147.     eor.l    d1,d3
  1148.  
  1149.     move.l    d3,d1
  1150.     lsr.l    #1,d1
  1151.     eor.l    d2,d1
  1152.     and.l    d6,d1
  1153.     eor.l    d1,d2
  1154.     add.l    d1,d1
  1155.     eor.l    d1,d3
  1156.  
  1157.  
  1158.     cmpa.l    a0,a5
  1159.     bgt.w    c3p32_1
  1160.  
  1161.     move.w    (NLWblit+4,sp),d5
  1162.     move.l    d2,(a2)  ;p1
  1163.     move.l    d3,(a1)  ;p0
  1164.  
  1165.     rts
  1166.     cnop    0,4
  1167.  
  1168.  
  1169. con2p32
  1170.  
  1171.     movem.l (DP0point+4,sp),a1-a2
  1172.     move.l    #$03030303,d4
  1173.     move.l    d4,a6
  1174.     move.l    (a0)+,d0
  1175.     move.l    (a0)+,d2
  1176.     move.l    (a0)+,d1
  1177.     move.l    (a0)+,d3
  1178.     and.l    d4,d0
  1179.     and.l    d4,d2
  1180.     lsl.l    #4,d0
  1181.     or.l    d2,d0
  1182.     and.l    d4,d1
  1183.     and.l    d4,d3
  1184.     lsl.l    #4,d1
  1185.     or.l    d3,d1
  1186.     move.l    d4,d2
  1187.     move.l    d4,d3
  1188.     move.l    d4,d7
  1189.     and.l  (a0)+,d2
  1190.     and.l  (a0)+,d4
  1191.     and.l  (a0)+,d3
  1192.     and.l  (a0)+,d7
  1193.     lsl.l    #4,d2
  1194.     or.l    d4,d2
  1195.     lsl.l    #4,d3
  1196.     or.l    d7,d3
  1197.     move.l    d2,d7
  1198.     move.l    d3,d4
  1199.     move.w    d0,d2
  1200.     move.w    d1,d3
  1201.     swap    d2
  1202.     swap    d3
  1203.     move.w    d2,d0
  1204.     move.w    d3,d1
  1205.     move.w    d7,d2
  1206.     move.w    d4,d3
  1207.     bra.b    c2p32_2
  1208.     cnop    0,4
  1209.  
  1210.  
  1211. c2p32_1
  1212.     movea.l d2,a4
  1213.     movea.l d3,a3
  1214.     move.l    (a0)+,d0
  1215.     move.l    (a0)+,d2
  1216.     move.l    (a0)+,d1
  1217.     move.l    (a0)+,d3
  1218.     move.l    a6,d4
  1219.     and.l    d4,d0
  1220.     and.l    d4,d2
  1221.     lsl.l    #4,d0
  1222.     or.l    d2,d0
  1223.     and.l    d4,d1
  1224.     and.l    d4,d3
  1225.     lsl.l    #4,d1
  1226.     or.l    d3,d1
  1227.     move.l    d4,d2
  1228.     move.l    d4,d3
  1229.     move.l    d4,d7
  1230.     and.l  (a0)+,d2
  1231.     and.l  (a0)+,d4
  1232.     and.l  (a0)+,d3
  1233.     and.l  (a0)+,d7
  1234.  
  1235.     move.l    a4,(a2)+      ;p1
  1236.  
  1237.     lsl.l    #4,d2
  1238.     or.l    d4,d2
  1239.     lsl.l    #4,d3
  1240.     or.l    d7,d3
  1241.  
  1242.     move.l    d2,d7
  1243.     move.l    d3,d4
  1244.     move.w    d0,d2
  1245.     move.w    d1,d3
  1246.     swap    d2
  1247.     swap    d3
  1248.     move.w    d2,d0
  1249.     move.w    d3,d1
  1250.     move.w    d7,d2
  1251.     move.w    d4,d3
  1252.  
  1253.     move.l    a3,(a1)+ ;p0
  1254.  
  1255.  
  1256. c2p32_2
  1257.     lsl.l    #2,d0
  1258.     lsl.l    #2,d1
  1259.     or.l    d0,d2
  1260.     or.l    d1,d3
  1261.  
  1262.     move.l    d3,d1
  1263.     lsr.l    #8,d1
  1264.     eor.l    d2,d1
  1265.     and.l    #$00ff00ff,d1
  1266.     eor.l    d1,d2
  1267.     lsl.l    #8,d1
  1268.     eor.l    d1,d3
  1269.  
  1270.     move.l    d3,d1
  1271.     lsr.l    #1,d1
  1272.     eor.l    d2,d1
  1273.     and.l    d6,d1
  1274.     eor.l    d1,d2
  1275.     add.l    d1,d1
  1276.     eor.l    d1,d3
  1277.     cmpa.l    a0,a5
  1278.     bgt.b    c2p32_1
  1279.  
  1280.     move.w    (NLWblit+4,sp),d5
  1281.     move.l    d2,(a2)  ;p1
  1282.     move.l    d3,(a1)  ;p0
  1283.  
  1284.     rts
  1285.     cnop    0,4
  1286.  
  1287.  
  1288.  
  1289. con1p32
  1290.  
  1291.     move.l    (DP0point+4,sp),a1
  1292.     move.l    #$01010101,a3
  1293.     move.l    #$00ff00ff,a2
  1294.     move.l    a3,d4
  1295.     move.l    (a0)+,d0
  1296.     move.l    (a0)+,d2
  1297.     move.l    (a0)+,d1
  1298.     move.l    (a0)+,d3
  1299.     and.l    d4,d0
  1300.     and.l    d4,d2
  1301.     lsl.l    #4,d0
  1302.     or.l    d2,d0
  1303.     and.l    d4,d1
  1304.     and.l    d4,d3
  1305.     lsl.l    #4,d1
  1306.     or.l    d3,d1
  1307.     move.l    d4,d2
  1308.     move.l    d4,d3
  1309.     move.l    d4,d7
  1310.     and.l  (a0)+,d2
  1311.     and.l  (a0)+,d4
  1312.     and.l  (a0)+,d3
  1313.     and.l  (a0)+,d7
  1314.     bra.b    c1p32_2
  1315.     cnop    0,4
  1316.  
  1317.  
  1318. c1p32_1
  1319.     movea.l d3,a4
  1320.     move.l    (a0)+,d0
  1321.     move.l    (a0)+,d2
  1322.     move.l    (a0)+,d1
  1323.     move.l    (a0)+,d3
  1324.     move.l    a3,d4
  1325.     and.l    d4,d0
  1326.     and.l    d4,d2
  1327.     lsl.l    #4,d0
  1328.     or.l    d2,d0
  1329.     and.l    d4,d1
  1330.     and.l    d4,d3
  1331.     lsl.l    #4,d1
  1332.     or.l    d3,d1
  1333.     move.l    d4,d2
  1334.     move.l    d4,d3
  1335.     move.l    d4,d7
  1336.     and.l  (a0)+,d2
  1337.     and.l  (a0)+,d4
  1338.     and.l  (a0)+,d3
  1339.     and.l  (a0)+,d7
  1340.  
  1341.     move.l    a4,(a1)+ ;p0
  1342.  
  1343.  
  1344. c1p32_2
  1345.     lsl.l    #4,d2
  1346.     or.l    d4,d2
  1347.     lsl.l    #4,d3
  1348.     or.l    d7,d3
  1349.     move.l    d2,d7
  1350.     move.l    d3,d4
  1351.     move.w    d0,d2
  1352.     move.w    d1,d3
  1353.     swap    d2
  1354.     swap    d3
  1355.     move.w    d2,d0
  1356.     move.w    d3,d1
  1357.     move.w    d7,d2
  1358.     move.w    d4,d3
  1359.  
  1360.     lsl.l    #2,d0
  1361.     lsl.l    #2,d1
  1362.     or.l    d0,d2
  1363.     or.l    d1,d3
  1364.  
  1365.     move.l    d3,d1
  1366.     move.l    a2,d4
  1367.     lsr.l    #8,d1
  1368.     eor.l    d2,d1
  1369.     and.l    d4,d1
  1370.     eor.l    d1,d2
  1371.     lsl.l    #8,d1
  1372.     eor.l    d1,d3
  1373.  
  1374.     add.l    d2,d2
  1375.     or.l    d2,d3
  1376.  
  1377.     cmpa.l    a0,a5
  1378.     bgt.b    c1p32_1
  1379.     move.w    (NLWblit+4,sp),d5
  1380.     move.l     d3,(a1)
  1381.  
  1382.  
  1383.     rts
  1384.     cnop    0,4
  1385.  
  1386.  
  1387.  
  1388.  
  1389. con8p32
  1390.     movem.l (DP4point+4,sp),a1-a4
  1391.     move.l    #$F0F0F0F0,d4
  1392.     move.l    (a0)+,d0
  1393.     move.l    (a0)+,d2
  1394.     move.l    (a0)+,d1
  1395.     move.l    (a0)+,d3
  1396.  
  1397.     and.l    d4,d2
  1398.     and.l    d4,d3
  1399.     lsr.l    #4,d2
  1400.     lsr.l    #4,d3
  1401.     and.l    d4,d0
  1402.     and.l    d4,d1
  1403.     or.l    d2,d0
  1404.     or.l    d3,d1
  1405.  
  1406.     move.l    d4,d2
  1407.     move.l    d4,d3
  1408.     move.l    d4,d7
  1409.     and.l  (a0)+,d2
  1410.     and.l  (a0)+,d4
  1411.     and.l  (a0)+,d3
  1412.     and.l  (a0)+,d7
  1413.     lsr.l    #4,d4
  1414.     or.l    d4,d2
  1415.     lsr.l    #4,d7
  1416.     or.l    d7,d3
  1417.     move.l    d2,d7
  1418.     move.l    d3,d4
  1419.     move.w    d0,d2
  1420.     move.w    d1,d3
  1421.     swap    d2
  1422.     swap    d3
  1423.     move.w    d2,d0
  1424.     move.w    d3,d1
  1425.     move.w    d7,d2
  1426.     move.w    d4,d3
  1427.     bra.b    c8p32_2
  1428.     cnop    0,4
  1429.  
  1430.  
  1431. c8p32_1
  1432.     movea.l d2,a6
  1433.     move.l    (a0)+,d0
  1434.     move.l    (a0)+,d2
  1435.     move.l    (a0)+,d1
  1436.     move.l    (a0)+,d3
  1437.  
  1438.     move.l    d4,(a1)+ ;p4
  1439.  
  1440.     move.l    #$F0F0F0F0,d4
  1441.     and.l    d4,d2
  1442.     and.l    d4,d3
  1443.     lsr.l    #4,d2
  1444.     lsr.l    #4,d3
  1445.     and.l    d4,d0
  1446.     and.l    d4,d1
  1447.     or.l    d2,d0
  1448.     or.l    d3,d1
  1449.  
  1450.     move.l    d4,d2
  1451.     move.l    d4,d3
  1452.     and.l  (a0)+,d2
  1453.     and.l  (a0)+,d3
  1454.     lsr.l    #4,d3
  1455.     or.l    d3,d2
  1456.     move.l    d4,d3
  1457.     and.l  (a0)+,d3
  1458.     and.l  (a0)+,d4
  1459.  
  1460.     move.l    d7,(a3)+ ;p6
  1461.  
  1462.     lsr.l    #4,d4
  1463.     or.l    d4,d3
  1464.     move.l    d2,d7
  1465.     move.l    d3,d4
  1466.     move.w    d0,d2
  1467.     move.w    d1,d3
  1468.     swap    d2
  1469.     swap    d3
  1470.     move.w    d2,d0
  1471.     move.w    d3,d1
  1472.     move.w    d7,d2
  1473.     move.w    d4,d3
  1474.  
  1475.     move.l    a6,(a2)+ ;p5
  1476.  
  1477.  
  1478. c8p32_2 move.l    d2,d7
  1479.     move.l    d3,d4
  1480.     lsr.l    #2,d7
  1481.     lsr.l    #2,d4
  1482.     eor.l    d0,d7
  1483.     eor.l    d1,d4
  1484.     and.l    d5,d7
  1485.     and.l    d5,d4
  1486.     eor.l    d7,d0
  1487.     eor.l    d4,d1
  1488.     lsl.l    #2,d7
  1489.     lsl.l    #2,d4
  1490.     eor.l    d7,d2
  1491.     eor.l    d4,d3
  1492.  
  1493.     move.l    d1,d7
  1494.     move.l    #$00ff00ff,d4
  1495.     lsr.l    #8,d7
  1496.     eor.l    d0,d7
  1497.     and.l    d4,d7
  1498.     eor.l    d7,d0
  1499.     lsl.l    #8,d7
  1500.     eor.l    d7,d1
  1501.  
  1502.     move.l    d1,d7
  1503.     lsr.l    #1,d7
  1504.     eor.l    d0,d7
  1505.     and.l    d6,d7
  1506.     eor.l    d7,d0
  1507.  
  1508.     move.l    d0,(a4)+ ;p7
  1509.  
  1510.     add.l    d7,d7
  1511.     eor.l    d1,d7
  1512.  
  1513.     move.l    d3,d1
  1514.     lsr.l    #8,d1
  1515.     eor.l    d2,d1
  1516.     and.l    d4,d1
  1517.     eor.l    d1,d2
  1518.     lsl.l    #8,d1
  1519.     eor.l    d1,d3
  1520.  
  1521.     move.l    d3,d4
  1522.     lsr.l    #1,d4
  1523.     eor.l    d2,d4
  1524.     and.l    d6,d4
  1525.     eor.l    d4,d2
  1526.     add.l    d4,d4
  1527.     eor.l    d3,d4
  1528.  
  1529.     cmpa.l    a0,a5
  1530.     bgt.w    c8p32_1
  1531.  
  1532.     sub.w    (BWidth+4,sp),a0
  1533.  
  1534.     move.l    d7,(a3)  ;p6
  1535.  
  1536.     move.l    d4,(a1)  ;p4
  1537.     move.l    d2,(a2)  ;p5
  1538.  
  1539.     bra.w    con4p32
  1540.     cnop    0,4
  1541.  
  1542. con7p32
  1543.     movem.l (DP4point+4,sp),a1-a3
  1544.     move.l    #$F0F0F0F0,d4
  1545.     move.l    (a0)+,d0
  1546.     move.l    (a0)+,d2
  1547.     move.l    (a0)+,d1
  1548.     move.l    (a0)+,d3
  1549.     and.l    d4,d0
  1550.     and.l    d4,d2
  1551.     lsr.l    #4,d2
  1552.     or.l    d2,d0
  1553.     and.l    d4,d1
  1554.     and.l    d4,d3
  1555.     lsr.l    #4,d3
  1556.     or.l    d3,d1
  1557.     move.l    d4,d2
  1558.     move.l    d4,d3
  1559.     move.l    d4,d7
  1560.     and.l  (a0)+,d2
  1561.     and.l  (a0)+,d4
  1562.     and.l  (a0)+,d3
  1563.     and.l  (a0)+,d7
  1564.     lsr.l    #4,d4
  1565.     or.l    d4,d2
  1566.     lsr.l    #4,d7
  1567.     or.l    d7,d3
  1568.     move.l    d2,d7
  1569.     move.l    d3,d4
  1570.     move.w    d0,d2
  1571.     move.w    d1,d3
  1572.     swap    d2
  1573.     swap    d3
  1574.     move.w    d2,d0
  1575.     move.w    d3,d1
  1576.     move.w    d7,d2
  1577.     move.w    d4,d3
  1578.     bra.b    c7p32_2
  1579.     cnop    0,4
  1580.  
  1581.  
  1582. c7p32_1
  1583.     movea.l d2,a4
  1584.     movea.l d3,a6
  1585.     move.l    (a0)+,d0
  1586.     move.l    (a0)+,d2
  1587.     move.l    (a0)+,d1
  1588.     move.l    (a0)+,d3
  1589.     move.l    #$F0F0F0F0,d4
  1590.     and.l    d4,d0
  1591.     and.l    d4,d2
  1592.     lsr.l    #4,d2
  1593.     or.l    d2,d0
  1594.     and.l    d4,d1
  1595.     and.l    d4,d3
  1596.     lsr.l    #4,d3
  1597.     or.l    d3,d1
  1598.     move.l    d4,d2
  1599.     move.l    d4,d3
  1600.     move.l    d4,d7
  1601.     and.l  (a0)+,d2
  1602.     and.l  (a0)+,d4
  1603.     and.l  (a0)+,d3
  1604.     and.l  (a0)+,d7
  1605.  
  1606.     move.l    a4,(a2)+ ;p5
  1607.  
  1608.     lsr.l    #4,d4
  1609.     or.l    d4,d2
  1610.     lsr.l    #4,d7
  1611.     or.l    d7,d3
  1612.     move.l    d2,d7
  1613.     move.l    d3,d4
  1614.     move.w    d0,d2
  1615.     move.w    d1,d3
  1616.     swap    d2
  1617.     swap    d3
  1618.     move.w    d2,d0
  1619.     move.w    d3,d1
  1620.     move.w    d7,d2
  1621.     move.w    d4,d3
  1622.  
  1623.     move.l    a6,(a1)+ ;p4
  1624.  
  1625.  
  1626. c7p32_2 move.l    d2,d7
  1627.     move.l    d3,d4
  1628.     lsr.l    #2,d7
  1629.     lsr.l    #2,d4
  1630.     eor.l    d0,d7
  1631.     eor.l    d1,d4
  1632.     and.l    d5,d7
  1633.     and.l    d5,d4
  1634.     eor.l    d7,d0
  1635.     eor.l    d4,d1
  1636.     lsl.l    #2,d7
  1637.     lsl.l    #2,d4
  1638.     eor.l    d7,d2
  1639.     eor.l    d4,d3
  1640.  
  1641.     move.l    d1,d7
  1642.     move.l    #$00ff00ff,d4
  1643.     lsr.l    #8,d7
  1644.     eor.l    d0,d7
  1645.     and.l    d4,d7
  1646.     eor.l    d7,d0
  1647.     lsl.l    #8,d7
  1648.     eor.l    d1,d7
  1649.  
  1650.     and.l    d6,d0
  1651.     and.l    d6,d7
  1652.     add.l    d0,d0
  1653.     or.l    d0,d7
  1654.  
  1655.     move.l    d7,(a3)+ ;p6
  1656.  
  1657.     move.l    d3,d1
  1658.     lsr.l    #8,d1
  1659.     eor.l    d2,d1
  1660.     and.l    d4,d1
  1661.     eor.l    d1,d2
  1662.     lsl.l    #8,d1
  1663.     eor.l    d1,d3
  1664.  
  1665.     move.l    d3,d1
  1666.     lsr.l    #1,d1
  1667.     eor.l    d2,d1
  1668.     and.l    d6,d1
  1669.     eor.l    d1,d2
  1670.     add.l    d1,d1
  1671.     eor.l    d1,d3
  1672.     cmpa.l    a0,a5
  1673.     bgt.w    c7p32_1
  1674.  
  1675.     sub.w    (BWidth+4,sp),a0
  1676.     move.l    d3,(a1)  ;p4
  1677.     move.l    d2,(a2)  ;p5
  1678.  
  1679.     bra.w    con4p32
  1680.     cnop    0,4
  1681.  
  1682. con6p32
  1683.     movem.l (DP4point+4,sp),a1-a2
  1684.     move.l    #$30303030,d4
  1685.     move.l    d4,a6
  1686.     move.l    (a0)+,d0
  1687.     move.l    (a0)+,d2
  1688.     move.l    (a0)+,d1
  1689.     move.l    (a0)+,d3
  1690.     and.l    d4,d0
  1691.     and.l    d4,d2
  1692.     lsr.l    #4,d2
  1693.     or.l    d2,d0
  1694.     and.l    d4,d1
  1695.     and.l    d4,d3
  1696.     lsr.l    #4,d3
  1697.     or.l    d3,d1
  1698.     move.l    d4,d2
  1699.     move.l    d4,d3
  1700.     move.l    d4,d7
  1701.     and.l  (a0)+,d2
  1702.     and.l  (a0)+,d4
  1703.     and.l  (a0)+,d3
  1704.     and.l  (a0)+,d7
  1705.     lsr.l    #4,d4
  1706.     or.l    d4,d2
  1707.     lsr.l    #4,d7
  1708.     or.l    d7,d3
  1709.     move.l    d2,d7
  1710.     move.l    d3,d4
  1711.     move.w    d0,d2
  1712.     move.w    d1,d3
  1713.     swap    d2
  1714.     swap    d3
  1715.     move.w    d2,d0
  1716.     move.w    d3,d1
  1717.     move.w    d7,d2
  1718.     move.w    d4,d3
  1719.     bra.b    c6p32_2
  1720.     cnop    0,4
  1721.  
  1722.  
  1723. c6p32_1
  1724.     movea.l d2,a3
  1725.     movea.l d3,a4
  1726.     move.l    (a0)+,d0
  1727.     move.l    (a0)+,d2
  1728.     move.l    (a0)+,d1
  1729.     move.l    (a0)+,d3
  1730.     move.l    a6,d4
  1731.     and.l    d4,d0
  1732.     and.l    d4,d2
  1733.     lsr.l    #4,d2
  1734.     or.l    d2,d0
  1735.     and.l    d4,d1
  1736.     and.l    d4,d3
  1737.     lsr.l    #4,d3
  1738.     or.l    d3,d1
  1739.     move.l    d4,d2
  1740.     move.l    d4,d3
  1741.     move.l    d4,d7
  1742.     and.l  (a0)+,d2
  1743.     and.l  (a0)+,d4
  1744.     and.l  (a0)+,d3
  1745.     and.l  (a0)+,d7
  1746.  
  1747.     move.l    a3,(a2)+ ;p5
  1748.  
  1749.     lsr.l    #4,d4
  1750.     or.l    d4,d2
  1751.     lsr.l    #4,d7
  1752.     or.l    d7,d3
  1753.     move.l    d2,d7
  1754.     move.l    d3,d4
  1755.     move.w    d0,d2
  1756.     move.w    d1,d3
  1757.     swap    d2
  1758.     swap    d3
  1759.     move.w    d2,d0
  1760.     move.w    d3,d1
  1761.     move.w    d7,d2
  1762.     move.w    d4,d3
  1763.  
  1764.     move.l    a4,(a1)+ ;p4
  1765.  
  1766.  
  1767. c6p32_2
  1768.     lsl.l    #2,d0
  1769.     lsl.l    #2,d1
  1770.     or.l    d0,d2
  1771.     or.l    d1,d3
  1772.  
  1773.     move.l    d3,d1
  1774.     lsr.l    #8,d1
  1775.     eor.l    d2,d1
  1776.     and.l    #$00ff00ff,d1
  1777.     eor.l    d1,d2
  1778.     lsl.l    #8,d1
  1779.     eor.l    d1,d3
  1780.  
  1781.     move.l    d3,d1
  1782.     lsr.l    #1,d1
  1783.     eor.l    d2,d1
  1784.     and.l    d6,d1
  1785.     eor.l    d1,d2
  1786.     add.l    d1,d1
  1787.     eor.l    d1,d3
  1788.     cmpa.l    a0,a5
  1789.     bgt.b    c6p32_1
  1790.  
  1791.     sub.w    (BWidth+4,sp),a0
  1792.     move.l    d3,(a1)  ;p4
  1793.     move.l    d2,(a2)  ;p5
  1794.  
  1795.     bra.w    con4p32
  1796.     cnop    0,4
  1797.  
  1798.  
  1799. con5p32
  1800.     move.l    (DP4point+4,sp),a1
  1801.     move.l    #$10101010,a3
  1802.     move.l    #$00ff00ff,a4
  1803.     move.l    a3,d4
  1804.     move.l    (a0)+,d0
  1805.     move.l    (a0)+,d2
  1806.     move.l    (a0)+,d1
  1807.     move.l    (a0)+,d3
  1808.     and.l    d4,d0
  1809.     and.l    d4,d2
  1810.     lsr.l    #4,d2
  1811.     or.l    d2,d0
  1812.     and.l    d4,d1
  1813.     and.l    d4,d3
  1814.     lsr.l    #4,d3
  1815.     or.l    d3,d1
  1816.     move.l    d4,d2
  1817.     move.l    d4,d3
  1818.     move.l    d4,d7
  1819.     and.l  (a0)+,d2
  1820.     and.l  (a0)+,d4
  1821.     and.l  (a0)+,d3
  1822.     and.l  (a0)+,d7
  1823.     bra.b    c5p32_2
  1824.     cnop    0,4
  1825.  
  1826.  
  1827. c5p32_1
  1828.     movea.l d3,a2
  1829.     move.l    (a0)+,d0
  1830.     move.l    (a0)+,d2
  1831.     move.l    (a0)+,d1
  1832.     move.l    (a0)+,d3
  1833.  
  1834.     move.l    a3,d4
  1835.     and.l    d4,d0
  1836.     and.l    d4,d2
  1837.     lsr.l    #4,d2
  1838.     or.l    d2,d0
  1839.     and.l    d4,d1
  1840.     and.l    d4,d3
  1841.     lsr.l    #4,d3
  1842.     or.l    d3,d1
  1843.     move.l    d4,d2
  1844.     move.l    d4,d3
  1845.     move.l    d4,d7
  1846.     and.l  (a0)+,d2
  1847.     and.l  (a0)+,d4
  1848.     and.l  (a0)+,d3
  1849.     and.l  (a0)+,d7
  1850.  
  1851.     move.l    a2,(a1)+ ;p4
  1852.  
  1853.  
  1854.  
  1855. c5p32_2
  1856.  
  1857.     lsr.l    #4,d4
  1858.     or.l    d4,d2
  1859.     lsr.l    #4,d7
  1860.     or.l    d7,d3
  1861.     move.l    d2,d7
  1862.     move.l    d3,d4
  1863.     move.w    d0,d2
  1864.     move.w    d1,d3
  1865.     swap    d2
  1866.     swap    d3
  1867.     move.w    d2,d0
  1868.     move.w    d3,d1
  1869.     move.w    d7,d2
  1870.     move.w    d4,d3
  1871.  
  1872.     lsl.l    #2,d0
  1873.     lsl.l    #2,d1
  1874.     or.l    d0,d2
  1875.     or.l    d1,d3
  1876.  
  1877.     move.l    d3,d1
  1878.     move.l    a4,d4
  1879.     lsr.l    #8,d1
  1880.     eor.l    d2,d1
  1881.     and.l    d4,d1
  1882.     eor.l    d1,d2
  1883.     lsl.l    #8,d1
  1884.     eor.l    d1,d3
  1885.  
  1886.     add.l    d2,d2
  1887.     or.l    d2,d3
  1888.  
  1889.     cmpa.l    a0,a5
  1890.     bgt.b    c5p32_1
  1891.  
  1892.     sub.w    (BWidth+4,sp),a0
  1893.     move.l    d3,(a1)  ;p4
  1894.  
  1895.     bra.w    con4p32
  1896.     cnop    0,4
  1897.  
  1898.  
  1899.  
  1900.  
  1901. AlignChunky:
  1902.     ; d0-d7/a1-a5 trashed
  1903.     ; a6 not used
  1904.     ; d5 = depth
  1905.     ; a0 = chunky src
  1906.     ;
  1907.     ;
  1908.     move.w    (.jmp,pc,d5.w*2),d0
  1909.     jmp    (.jmp,pc,d0.w)
  1910.     cnop    0,4
  1911.  
  1912. .jmp
  1913.     dc.w    a1p-.jmp   ; 1 plane
  1914.     dc.w    a2p-.jmp   ; 2 planes
  1915.     dc.w    a3p-.jmp   ; 3 planes
  1916.     dc.w    a4p-.jmp   ; 4 planes
  1917.     dc.w    a5p-.jmp   ; 5 planes
  1918.     dc.w    a6p-.jmp   ; 6 planes
  1919.     dc.w    a7p-.jmp   ; 7 planes
  1920.     dc.w    a8p-.jmp   ; 8 planes
  1921.     cnop    0,4
  1922.  
  1923.  
  1924. a4p
  1925.  
  1926.     movem.l (DP0point+4,sp),a1-a4
  1927.     add.l    a5,a1
  1928.     add.l    a5,a2
  1929.     add.l    a5,a3
  1930.     add.l    a5,a4
  1931.  
  1932.     move.l    #$0F0F0F0F,d4
  1933.     move.l    (a0)+,d0
  1934.     move.l    (a0)+,d2
  1935.     move.l    (a0)+,d1
  1936.     move.l    (a0)+,d3
  1937.     and.l    d4,d0
  1938.     and.l    d4,d2
  1939.     lsl.l    #4,d0
  1940.     and.l    d4,d1
  1941.     or.l    d2,d0
  1942.     lsl.l    #4,d1
  1943.     and.l    d4,d3
  1944.     or.l    d3,d1
  1945.     move.l    d4,d2
  1946.     move.l    d4,d3
  1947.     move.l    d4,d7
  1948.     and.l  (a0)+,d2
  1949.     and.l  (a0)+,d4
  1950.     and.l  (a0)+,d3
  1951.     and.l  (a0)+,d7
  1952.     lsl.l    #4,d2
  1953.     lsl.l    #4,d3
  1954.     or.l    d4,d2
  1955.     or.l    d7,d3
  1956.  
  1957.     move.l    d2,d5
  1958.     move.l    d3,d4
  1959.     move.w    d0,d2
  1960.     move.w    d1,d3
  1961.     swap    d2
  1962.     swap    d3
  1963.     move.w    d2,d0
  1964.     move.w    d3,d1
  1965.     move.w    d5,d2
  1966.     move.w    d4,d3
  1967.  
  1968.     move.l    #$33333333,d5
  1969.  
  1970.     move.l    d2,d7
  1971.     move.l    d3,d4
  1972.     lsr.l    #2,d7
  1973.     lsr.l    #2,d4
  1974.     eor.l    d0,d7
  1975.     eor.l    d1,d4
  1976.     and.l    d5,d7
  1977.     and.l    d5,d4
  1978.     eor.l    d7,d0
  1979.     eor.l    d4,d1
  1980.     lsl.l    #2,d7
  1981.     lsl.l    #2,d4
  1982.     eor.l    d7,d2
  1983.     eor.l    d4,d3
  1984.  
  1985.     move.l    #$00ff00ff,d4
  1986.  
  1987.     move.l    d1,d7
  1988.     move.l    d3,d5
  1989.     lsr.l    #8,d7
  1990.     lsr.l    #8,d5
  1991.     eor.l    d0,d7
  1992.     eor.l    d2,d5
  1993.     and.l    d4,d7
  1994.     and.l    d4,d5
  1995.     eor.l    d7,d0
  1996.     eor.l    d5,d2
  1997.     lsl.l    #8,d7
  1998.     lsl.l    #8,d5
  1999.     eor.l    d7,d1
  2000.     eor.l    d5,d3
  2001.  
  2002.     move.l    #$55555555,d4
  2003.  
  2004.     move.l    d1,d7
  2005.     move.l    d3,d5
  2006.     lsr.l    #1,d7
  2007.     lsr.l    #1,d5
  2008.     eor.l    d0,d7
  2009.     eor.l    d2,d5
  2010.     and.l    d4,d7
  2011.     and.l    d4,d5
  2012.     eor.l    d7,d0
  2013.     eor.l    d5,d2
  2014.     add.l    d7,d7
  2015.     add.l    d5,d5
  2016.     eor.l    d1,d7
  2017.     eor.l    d5,d3
  2018.  
  2019.     and.l    d6,d0
  2020.     and.l    d6,d2
  2021.     and.l    d6,d3
  2022.     and.l    d6,d7
  2023.  
  2024.     not.l    d6
  2025.  
  2026.  
  2027.     move.l    d6,d1
  2028.     and.l    (a4),d1
  2029.     or.l    d1,d0
  2030.     move.l    d0,(a4)  ;p3
  2031.  
  2032.     move.l    d6,d4
  2033.     and.l    (a2),d4
  2034.     or.l    d4,d2
  2035.     move.l    d2,(a2)  ;p1
  2036.  
  2037.     move.l    d6,d5
  2038.     and.l    (a1),d5
  2039.     or.l    d5,d3
  2040.     move.l    d6,d1
  2041.     move.l    d3,(a1)  ;p0
  2042.  
  2043.     and.l    (a3),d1
  2044.     or.l    d1,d7
  2045.     move.w    (NLWblit+4,sp),d5
  2046.     move.l    d7,(a3)  ;p2
  2047.     not.l    d6
  2048.  
  2049.     rts
  2050.     cnop    0,4
  2051.  
  2052.  
  2053.  
  2054. a3p    movem.l (DP0point+4,sp),a1-a3
  2055.     add.l    a5,a1
  2056.     add.l    a5,a2
  2057.     add.l    a5,a3
  2058.  
  2059.     move.l    #$0F0F0F0F,d4
  2060.     move.l    (a0)+,d0
  2061.     move.l    (a0)+,d2
  2062.     move.l    (a0)+,d1
  2063.     move.l    (a0)+,d3
  2064.     and.l    d4,d0
  2065.     and.l    d4,d2
  2066.     lsl.l    #4,d0
  2067.     and.l    d4,d1
  2068.     or.l    d2,d0
  2069.     lsl.l    #4,d1
  2070.     and.l    d4,d3
  2071.     or.l    d3,d1
  2072.     move.l    d4,d2
  2073.     move.l    d4,d3
  2074.     move.l    d4,d7
  2075.     and.l  (a0)+,d2
  2076.     and.l  (a0)+,d4
  2077.     and.l  (a0)+,d3
  2078.     and.l  (a0)+,d7
  2079.     lsl.l    #4,d2
  2080.     lsl.l    #4,d3
  2081.     or.l    d4,d2
  2082.     or.l    d7,d3
  2083.  
  2084.     move.l    d2,d4
  2085.     move.l    d3,d7
  2086.     move.w    d0,d2
  2087.     move.w    d1,d3
  2088.     swap    d2
  2089.     swap    d3
  2090.     move.w    d2,d0
  2091.     move.w    d3,d1
  2092.     move.w    d4,d2
  2093.     move.w    d7,d3
  2094.  
  2095.  
  2096.     move.l    #$33333333,d5
  2097.     move.l    d2,d7
  2098.     move.l    d3,d4
  2099.     lsr.l    #2,d7
  2100.     lsr.l    #2,d4
  2101.     eor.l    d0,d7
  2102.     eor.l    d1,d4
  2103.     and.l    d5,d7
  2104.     and.l    d5,d4
  2105.     eor.l    d7,d0
  2106.     eor.l    d4,d1
  2107.     lsl.l    #2,d7
  2108.     lsl.l    #2,d4
  2109.     eor.l    d7,d2
  2110.     eor.l    d4,d3
  2111.  
  2112.     move.l    #$00ff00ff,d4
  2113.     move.l    d1,d7
  2114.     move.l    d3,d5
  2115.     lsr.l    #8,d7
  2116.     lsr.l    #8,d5
  2117.     eor.l    d0,d7
  2118.     eor.l    d2,d5
  2119.     and.l    d4,d7
  2120.     and.l    d4,d5
  2121.     eor.l    d7,d0
  2122.     eor.l    d5,d2
  2123.     lsl.l    #8,d7
  2124.     lsl.l    #8,d5
  2125.     eor.l    d1,d7
  2126.     eor.l    d5,d3
  2127.  
  2128.     move.l    #$55555555,d4
  2129.     and.l    d4,d0
  2130.     and.l    d4,d7
  2131.     add.l    d0,d0
  2132.     or.l    d0,d7
  2133.  
  2134.     move.l    d3,d5
  2135.     lsr.l    #1,d5
  2136.     eor.l    d2,d5
  2137.     and.l    d4,d5
  2138.     eor.l    d5,d2
  2139.     add.l    d5,d5
  2140.     eor.l    d5,d3
  2141.  
  2142.     and.l    d6,d7
  2143.     and.l    d6,d2
  2144.     move.l    d6,d1
  2145.     and.l    d6,d3
  2146.  
  2147.     not.l    d1
  2148.  
  2149.     move.l    d1,d4
  2150.     and.l    (a2),d4
  2151.     or.l    d4,d2
  2152.     move.l    d2,(a2)  ;p1
  2153.  
  2154.     move.l    d1,d5
  2155.     and.l    (a1),d5
  2156.     or.l    d5,d3
  2157.     move.l    d3,(a1)  ;p0
  2158.  
  2159.     and.l    (a3),d1
  2160.     or.l    d1,d7
  2161.     move.w    (NLWblit+4,sp),d5
  2162.     move.l    d7,(a3)  ;p2
  2163.  
  2164.  
  2165.     rts
  2166.     cnop    0,4
  2167.  
  2168.  
  2169.  
  2170.  
  2171. a2p    movem.l (DP0point+4,sp),a1-a2
  2172.     add.l    a5,a1
  2173.     add.l    a5,a2
  2174.     move.l    #$03030303,d4
  2175.     move.l    (a0)+,d0
  2176.     move.l    (a0)+,d2
  2177.     move.l    (a0)+,d1
  2178.     move.l    (a0)+,d3
  2179.     and.l    d4,d0
  2180.     and.l    d4,d2
  2181.     lsl.l    #4,d0
  2182.     or.l    d2,d0
  2183.     and.l    d4,d1
  2184.     and.l    d4,d3
  2185.     lsl.l    #4,d1
  2186.     or.l    d3,d1
  2187.     move.l    d4,d2
  2188.     move.l    d4,d3
  2189.     move.l    d4,d7
  2190.     and.l  (a0)+,d2
  2191.     and.l  (a0)+,d4
  2192.     and.l  (a0)+,d3
  2193.     and.l  (a0)+,d7
  2194.     lsl.l    #4,d2
  2195.     or.l    d4,d2
  2196.     lsl.l    #4,d3
  2197.     or.l    d7,d3
  2198.  
  2199.     move.l    d2,d4
  2200.     move.l    d3,d7
  2201.     move.w    d0,d2
  2202.     move.w    d1,d3
  2203.     swap    d2
  2204.     swap    d3
  2205.     move.w    d2,d0
  2206.     move.w    d3,d1
  2207.     move.w    d4,d2
  2208.     move.w    d7,d3
  2209.  
  2210.     lsl.l    #2,d0
  2211.     lsl.l    #2,d1
  2212.     or.l    d0,d2
  2213.     or.l    d1,d3
  2214.  
  2215.     move.l    d3,d1
  2216.     lsr.l    #8,d1
  2217.     eor.l    d2,d1
  2218.     and.l    #$00ff00ff,d1
  2219.     eor.l    d1,d2
  2220.     lsl.l    #8,d1
  2221.     eor.l    d1,d3
  2222.  
  2223.     move.l    d3,d1
  2224.     lsr.l    #1,d1
  2225.     eor.l    d2,d1
  2226.     and.l    #$55555555,d1
  2227.     eor.l    d1,d2
  2228.     add.l    d1,d1
  2229.     eor.l    d1,d3
  2230.  
  2231.     and.l    d6,d2
  2232.     move.l    d6,d1
  2233.     and.l    d6,d3
  2234.  
  2235.     not.l    d1
  2236.  
  2237.     move.l    d1,d4
  2238.     and.l    (a2),d4
  2239.     or.l    d4,d2
  2240.     move.l    d2,(a2)  ;p1
  2241.  
  2242.     and.l    (a1),d1
  2243.     or.l    d1,d3
  2244.     move.w    (NLWblit+4,sp),d5
  2245.     move.l    d3,(a1)  ;p0
  2246.  
  2247.     rts
  2248.     cnop    0,4
  2249.  
  2250.  
  2251.  
  2252.  
  2253. a1p    move.l    (DP0point+4,sp),a1
  2254.     add.l    a5,a1
  2255.     move.l    #$01010101,d4
  2256.     move.l    (a0)+,d0
  2257.     move.l    (a0)+,d2
  2258.     move.l    (a0)+,d1
  2259.     move.l    (a0)+,d3
  2260.     and.l    d4,d0
  2261.     and.l    d4,d2
  2262.     lsl.l    #4,d0
  2263.     or.l    d2,d0
  2264.     and.l    d4,d1
  2265.     and.l    d4,d3
  2266.     lsl.l    #4,d1
  2267.     or.l    d3,d1
  2268.     move.l    d4,d2
  2269.     move.l    d4,d3
  2270.     move.l    d4,d7
  2271.     and.l  (a0)+,d2
  2272.     and.l  (a0)+,d4
  2273.     and.l  (a0)+,d3
  2274.     and.l  (a0)+,d7
  2275.     lsl.l    #4,d2
  2276.     or.l    d4,d2
  2277.     lsl.l    #4,d3
  2278.     or.l    d7,d3
  2279.  
  2280.     move.l    d2,d4
  2281.     move.l    d3,d7
  2282.     move.w    d0,d2
  2283.     move.w    d1,d3
  2284.     swap    d2
  2285.     swap    d3
  2286.     move.w    d2,d0
  2287.     move.w    d3,d1
  2288.     move.w    d4,d2
  2289.     move.w    d7,d3
  2290.  
  2291.     lsl.l    #2,d0
  2292.     lsl.l    #2,d1
  2293.     or.l    d0,d2
  2294.     or.l    d1,d3
  2295.  
  2296.     move.l    d3,d1
  2297.     lsr.l    #8,d1
  2298.     eor.l    d2,d1
  2299.     and.l    #$00ff00ff,d1
  2300.     eor.l    d1,d2
  2301.     lsl.l    #8,d1
  2302.     eor.l    d1,d3
  2303.  
  2304.     add.l    d2,d2
  2305.     or.l    d2,d3
  2306.  
  2307.     move.l    d6,d1
  2308.     and.l    d6,d3
  2309.  
  2310.     not.l    d1
  2311.  
  2312.     and.l    (a1),d1
  2313.  
  2314.     or.l    d1,d3
  2315.     move.w    (NLWblit+4,sp),d5
  2316.     move.l    d3,(a1)  ;p0
  2317.  
  2318.     rts
  2319.     cnop    0,4
  2320.  
  2321.  
  2322.  
  2323.  
  2324. a8p
  2325.     movem.l (DP4point+4,sp),a1-a4
  2326.     move.l    #$F0F0F0F0,d4
  2327.     add.l    a5,a1
  2328.     add.l    a5,a2
  2329.     add.l    a5,a3
  2330.     add.l    a5,a4
  2331.     move.l    (a0)+,d0
  2332.     move.l    (a0)+,d2
  2333.     move.l    (a0)+,d1
  2334.     move.l    (a0)+,d3
  2335.     and.l    d4,d0
  2336.     and.l    d4,d2
  2337.     lsr.l    #4,d2
  2338.     or.l    d2,d0
  2339.     and.l    d4,d1
  2340.     and.l    d4,d3
  2341.     lsr.l    #4,d3
  2342.     or.l    d3,d1
  2343.     move.l    d4,d2
  2344.     move.l    d4,d3
  2345.     move.l    d4,d7
  2346.     and.l  (a0)+,d2
  2347.     and.l  (a0)+,d4
  2348.     and.l  (a0)+,d3
  2349.     and.l  (a0)+,d7
  2350.     lsr.l    #4,d4
  2351.     or.l    d4,d2
  2352.     lsr.l    #4,d7
  2353.     or.l    d7,d3
  2354.  
  2355.     move.l    d2,d4
  2356.     move.l    d3,d7
  2357.     move.w    d0,d2
  2358.     move.w    d1,d3
  2359.     swap    d2
  2360.     swap    d3
  2361.     move.w    d2,d0
  2362.     move.w    d3,d1
  2363.     move.w    d4,d2
  2364.     move.w    d7,d3
  2365.  
  2366.     move.l    #$33333333,d5
  2367.  
  2368.     move.l    d2,d7
  2369.     move.l    d3,d4
  2370.     lsr.l    #2,d7
  2371.     lsr.l    #2,d4
  2372.     eor.l    d0,d7
  2373.     eor.l    d1,d4
  2374.     and.l    d5,d7
  2375.     and.l    d5,d4
  2376.     eor.l    d7,d0
  2377.     eor.l    d4,d1
  2378.     lsl.l    #2,d7
  2379.     lsl.l    #2,d4
  2380.     eor.l    d7,d2
  2381.     eor.l    d4,d3
  2382.  
  2383.     move.l    d1,d7
  2384.     move.l    #$00ff00ff,d4
  2385.     move.l    d3,d5
  2386.     lsr.l    #8,d7
  2387.     lsr.l    #8,d5
  2388.     eor.l    d0,d7
  2389.     eor.l    d2,d5
  2390.     and.l    d4,d7
  2391.     and.l    d4,d5
  2392.     eor.l    d7,d0
  2393.     eor.l    d5,d2
  2394.     lsl.l    #8,d7
  2395.     lsl.l    #8,d5
  2396.     eor.l    d7,d1
  2397.     eor.l    d5,d3
  2398.  
  2399.     move.l    #$55555555,d4
  2400.  
  2401.     move.l    d1,d7
  2402.     move.l    d3,d5
  2403.     lsr.l    #1,d7
  2404.     lsr.l    #1,d5
  2405.     eor.l    d0,d7
  2406.     eor.l    d2,d5
  2407.     and.l    d4,d7
  2408.     and.l    d4,d5
  2409.     eor.l    d7,d0
  2410.     eor.l    d5,d2
  2411.     add.l    d7,d7
  2412.     add.l    d5,d5
  2413.     eor.l    d1,d7
  2414.     eor.l    d5,d3
  2415.  
  2416.  
  2417.     and.l    d6,d0
  2418.     and.l    d6,d2
  2419.     and.l    d6,d3
  2420.     and.l    d6,d7
  2421.  
  2422.     move.l    d6,d5
  2423.     not.l    d5
  2424.     move.l    d5,d1
  2425.     and.l    (a4),d1
  2426.     or.l    d1,d0
  2427.     move.l    d0,(a4)  ;p3
  2428.  
  2429.  
  2430.  
  2431.  
  2432.     move.l    d5,d4
  2433.     and.l    (a2),d4
  2434.     or.l    d4,d2
  2435.     move.l    d2,(a2)  ;p1
  2436.  
  2437.     move.l    d5,d1
  2438.     and.l    (a3),d1
  2439.     or.l    d1,d7
  2440.     move.l    d7,(a3)  ;p2
  2441.  
  2442.     and.l    (a1),d5
  2443.     or.l    d5,d3
  2444.     move.l    d3,(a1)  ;p0
  2445.  
  2446.  
  2447.     lea    (-32,a0),a0
  2448.     bra.w    a4p
  2449.     cnop    0,4
  2450.  
  2451. a7p
  2452.     movem.l (DP4point+4,sp),a1-a3
  2453.     add.l    a5,a1
  2454.     add.l    a5,a2
  2455.     add.l    a5,a3
  2456.     move.l    #$F0F0F0F0,d4
  2457.     move.l    (a0)+,d0
  2458.     move.l    (a0)+,d2
  2459.     move.l    (a0)+,d1
  2460.     move.l    (a0)+,d3
  2461.     and.l    d4,d0
  2462.     and.l    d4,d2
  2463.     lsr.l    #4,d2
  2464.     or.l    d2,d0
  2465.     and.l    d4,d1
  2466.     and.l    d4,d3
  2467.     lsr.l    #4,d3
  2468.     or.l    d3,d1
  2469.     move.l    d4,d2
  2470.     move.l    d4,d3
  2471.     move.l    d4,d7
  2472.     and.l  (a0)+,d2
  2473.     and.l  (a0)+,d4
  2474.     and.l  (a0)+,d3
  2475.     and.l  (a0)+,d7
  2476.     lsr.l    #4,d4
  2477.     or.l    d4,d2
  2478.     lsr.l    #4,d7
  2479.     or.l    d7,d3
  2480.  
  2481.     move.l    d2,d4
  2482.     move.l    d3,d7
  2483.     move.w    d0,d2
  2484.     move.w    d1,d3
  2485.     swap    d2
  2486.     swap    d3
  2487.     move.w    d2,d0
  2488.     move.w    d3,d1
  2489.     move.w    d4,d2
  2490.     move.w    d7,d3
  2491.  
  2492.     move.l    #$33333333,d5
  2493.     move.l    d2,d7
  2494.     move.l    d3,d4
  2495.     lsr.l    #2,d7
  2496.     lsr.l    #2,d4
  2497.     eor.l    d0,d7
  2498.     eor.l    d1,d4
  2499.     and.l    d5,d7
  2500.     and.l    d5,d4
  2501.     eor.l    d7,d0
  2502.     eor.l    d4,d1
  2503.     lsl.l    #2,d7
  2504.     lsl.l    #2,d4
  2505.     eor.l    d7,d2
  2506.     eor.l    d4,d3
  2507.  
  2508.     move.l    #$00ff00ff,d4
  2509.     move.l    d1,d7
  2510.     move.l    d3,d5
  2511.     lsr.l    #8,d7
  2512.     lsr.l    #8,d5
  2513.     eor.l    d0,d7
  2514.     eor.l    d2,d5
  2515.     and.l    d4,d7
  2516.     and.l    d4,d5
  2517.     eor.l    d7,d0
  2518.     eor.l    d5,d2
  2519.     lsl.l    #8,d7
  2520.     lsl.l    #8,d5
  2521.     eor.l    d1,d7
  2522.     eor.l    d5,d3
  2523.  
  2524.     move.l    #$55555555,d4
  2525.     and.l    d4,d0
  2526.     and.l    d4,d7
  2527.     add.l    d0,d0
  2528.     or.l    d0,d7
  2529.  
  2530.     move.l    d3,d5
  2531.     lsr.l    #1,d5
  2532.     eor.l    d2,d5
  2533.     and.l    d4,d5
  2534.     eor.l    d5,d2
  2535.     add.l    d5,d5
  2536.     eor.l    d5,d3
  2537.  
  2538.     and.l    d6,d2
  2539.     and.l    d6,d7
  2540.     and.l    d6,d3
  2541.  
  2542.     move.l    d6,d5
  2543.     not.l    d5
  2544.     move.l    d5,d4
  2545.     and.l    (a2),d4
  2546.     or.l    d4,d2
  2547.     move.l    d2,(a2)  ;p1
  2548.  
  2549.     move.l    d5,d1
  2550.     and.l    (a3),d1
  2551.     or.l    d1,d7
  2552.     move.l    d7,(a3)  ;p2
  2553.  
  2554.     and.l    (a1),d5
  2555.     or.l    d5,d3
  2556.     move.l    d3,(a1)  ;p0
  2557.  
  2558.  
  2559.     lea    (-32,a0),a0
  2560.     bra.w    a4p
  2561.     cnop    0,4
  2562.  
  2563. a6p
  2564.     movem.l (DP4point+4,sp),a1-a2
  2565.     move.l    #$30303030,d4
  2566.     add.l    a5,a1
  2567.     add.l    a5,a2
  2568.     move.l    (a0)+,d0
  2569.     move.l    (a0)+,d2
  2570.     move.l    (a0)+,d1
  2571.     move.l    (a0)+,d3
  2572.     and.l    d4,d0
  2573.     and.l    d4,d2
  2574.     lsr.l    #4,d2
  2575.     or.l    d2,d0
  2576.     and.l    d4,d1
  2577.     and.l    d4,d3
  2578.     lsr.l    #4,d3
  2579.     or.l    d3,d1
  2580.     move.l    d4,d2
  2581.     move.l    d4,d3
  2582.     move.l    d4,d7
  2583.     and.l  (a0)+,d2
  2584.     and.l  (a0)+,d4
  2585.     and.l  (a0)+,d3
  2586.     and.l  (a0)+,d7
  2587.     lsr.l    #4,d4
  2588.     or.l    d4,d2
  2589.     lsr.l    #4,d7
  2590.     or.l    d7,d3
  2591.  
  2592.     move.l    d2,d4
  2593.     move.l    d3,d7
  2594.     move.w    d0,d2
  2595.     move.w    d1,d3
  2596.     swap    d2
  2597.     swap    d3
  2598.     move.w    d2,d0
  2599.     move.w    d3,d1
  2600.     move.w    d4,d2
  2601.     move.w    d7,d3
  2602.  
  2603.     lsl.l    #2,d0
  2604.     lsl.l    #2,d1
  2605.     or.l    d0,d2
  2606.     or.l    d1,d3
  2607.  
  2608.     move.l    d3,d1
  2609.     lsr.l    #8,d1
  2610.     eor.l    d2,d1
  2611.     and.l    #$00ff00ff,d1
  2612.     eor.l    d1,d2
  2613.     lsl.l    #8,d1
  2614.     eor.l    d1,d3
  2615.  
  2616.     move.l    d3,d1
  2617.     lsr.l    #1,d1
  2618.     eor.l    d2,d1
  2619.     and.l    #$55555555,d1
  2620.     eor.l    d1,d2
  2621.     add.l    d1,d1
  2622.     eor.l    d1,d3
  2623.  
  2624.     move.l    d6,d5
  2625.     and.l    d6,d2
  2626.     and.l    d6,d3
  2627.     not.l    d5
  2628.     move.l    d5,d1
  2629.  
  2630.     and.l    (a2),d1
  2631.     or.l    d1,d2
  2632.     move.l    d2,(a2)  ;p5
  2633.  
  2634.     and.l    (a1),d5
  2635.     or.l    d5,d3
  2636.     move.l    d3,(a1)  ;p4
  2637.  
  2638.  
  2639.     lea    (-32,a0),a0
  2640.     bra.w    a4p
  2641.     cnop    0,4
  2642.  
  2643.  
  2644. a5p
  2645.     move.l    (DP4point+4,sp),a1
  2646.     add.l    a5,a1
  2647.     move.l    #$10101010,d4
  2648.     move.l    (a0)+,d0
  2649.     move.l    (a0)+,d2
  2650.     move.l    (a0)+,d1
  2651.     move.l    (a0)+,d3
  2652.     and.l    d4,d0
  2653.     and.l    d4,d2
  2654.     lsr.l    #4,d2
  2655.     or.l    d2,d0
  2656.     and.l    d4,d1
  2657.     and.l    d4,d3
  2658.     lsr.l    #4,d3
  2659.     or.l    d3,d1
  2660.     move.l    d4,d2
  2661.     move.l    d4,d3
  2662.     move.l    d4,d7
  2663.     and.l  (a0)+,d2
  2664.     and.l  (a0)+,d4
  2665.     and.l  (a0)+,d3
  2666.     and.l  (a0)+,d7
  2667.     lsr.l    #4,d4
  2668.     or.l    d4,d2
  2669.     lsr.l    #4,d7
  2670.     or.l    d7,d3
  2671.  
  2672.     move.l    d2,d4
  2673.     move.l    d3,d7
  2674.     move.w    d0,d2
  2675.     move.w    d1,d3
  2676.     swap    d2
  2677.     swap    d3
  2678.     move.w    d2,d0
  2679.     move.w    d3,d1
  2680.     move.w    d4,d2
  2681.     move.w    d7,d3
  2682.  
  2683.     lsl.l    #2,d0
  2684.     lsl.l    #2,d1
  2685.     or.l    d0,d2
  2686.     or.l    d1,d3
  2687.  
  2688.     move.l    d3,d1
  2689.     lsr.l    #8,d1
  2690.     eor.l    d2,d1
  2691.     and.l    #$00ff00ff,d1
  2692.     eor.l    d1,d2
  2693.     lsl.l    #8,d1
  2694.     eor.l    d1,d3
  2695.  
  2696.     add.l    d2,d2
  2697.     or.l    d2,d3
  2698.  
  2699.  
  2700.     move.l    d6,d5
  2701.     not.l    d5
  2702.     and.l    (a1),d5
  2703.  
  2704.  
  2705.     and.l    d6,d3
  2706.  
  2707.     or.l    d5,d3
  2708.  
  2709.     move.l    d3,(a1)  ;p4
  2710.  
  2711.     lea    (-32,a0),a0
  2712.     bra.w    a4p
  2713.     cnop    0,4
  2714.  
  2715.  
  2716.  
  2717.     ; d6 = rp_mask
  2718.     ; d7 = #planes mask
  2719. Masked_rp
  2720.     move.l    d3,(LLWmask,sp) ; save d1  ending mask
  2721.     move.w    d5,d1           ; We do this little bit here to see if we can't use
  2722. 10$    cmp.b    d7,d6           ; the regular routines since the mask could be for
  2723.     beq.w    NotMasked      ; an even spread of planes and the regular c2p
  2724.     lsr.b    #1,d7           ; is almost 2x faster.
  2725.     dbf    d5,10$           ;
  2726.     move.w    d1,d5           ;
  2727.     move.w    d2,(BWidth,sp)
  2728.  
  2729.     move.w    d0,(EndBit,sp)
  2730.     cmp.w    d4,d2           ; blitwidth-(amount in 1st LW)
  2731.     bgt.b    mmultiLW       ; convertion larger then then 1 lw, blit goes beyond 1st lw
  2732.     tst    d0           ; end of convertion bit
  2733.     beq.b    moneLW           ; ends at 32bit bound
  2734.     and.l    d3,(FLWmask,sp); blit smaller then 1st lw
  2735.  
  2736.  
  2737. moneLW    clr.w    (NLWblit,sp)
  2738.     bra.b    smrp
  2739.     cnop    0,4
  2740.  
  2741. mmultiLW
  2742.     sub.w    d4,d2
  2743.     sub.w    d0,d2        ; (width-start)-end=remaining conversion size
  2744.     lsr.w    #5,d2        ; size/32
  2745.     move.w    d2,(NLWblit,sp) ; # words to convert
  2746.  
  2747.  
  2748. smrp    move.w    a6,(sp) ;(HData,sp)
  2749.     moveq    #64,d0
  2750.     suba.l    d0,sp
  2751.     move.b    d6,d1
  2752.     lea    (mDP0point,sp),a0
  2753.      ;     lea     (SP0point,sp),a1
  2754.     movea.l sp,a1
  2755.     lea    (SP0,sp),a3
  2756.     moveq    #8,d2        ; need to do this for all 8 possible planes
  2757.     bra.b    30$
  2758.     cnop    0,4
  2759.  
  2760. 10$    move.l    a3,(a1)
  2761.     lsr.b    #1,d1        ; we clear masked out plane pointers here
  2762.     bcs.b    20$
  2763.     clr.l    (a0)
  2764.     clr.l    (a1)
  2765. 20$    addq.l    #4,a0
  2766.     addq.l    #4,a1
  2767.     addq.l    #4,a3
  2768. 30$    dbf    d2,10$
  2769.  
  2770.  
  2771. Firstmask
  2772.     tst.l    d4
  2773.     beq.b    Alignedmask
  2774.     lea    (-32,a2,d4.l),a0
  2775.     move.l    (mFLWmask,sp),d0
  2776.     moveq    #-4,d2
  2777.     bsr.b    Masked
  2778.  
  2779. Alignedmask
  2780.     moveq    #0,d0
  2781.     move.w    (mNLWblit,sp),d0
  2782.     beq.b    Lastmask
  2783.     lea    (a2,d4.l),a0
  2784.     lea    (mDP0point,sp),a3
  2785.     bsr.w    mask8p
  2786.  
  2787. Lastmask
  2788.     move.w    (mEndBit,sp),d0
  2789.     beq.b    Endmask
  2790.     movea.l a2,a0
  2791.     suba.w    d0,a0
  2792.     adda.w    (mBWidth,sp),a0
  2793.     moveq    #0,d2
  2794.     move.w    (mNLWblit,sp),d2
  2795.     lsl.l    #2,d2
  2796.     move.l    (mLLWmask,sp),d0
  2797.     bsr.b    Masked
  2798.  
  2799. Endmask
  2800.     lea    (mDP0point,sp),a3
  2801.     move.l    d5,d7
  2802.     move.l    (mDBPR,sp),d0
  2803.  
  2804. 10$    move.l    (a3),d1
  2805.     beq.b    15$
  2806.     add.l    d0,d1
  2807.     move.l    d1,(a3)
  2808. 15$    addq.l    #4,a3
  2809. 20$    dbf    d7,10$
  2810.     adda.w    (mHData,sp),a2
  2811.     subq.w     #1,(mLines,sp)
  2812.     bgt.b    Firstmask
  2813.     lea    (mstacked,sp),sp
  2814.     rts
  2815.     cnop    0,4
  2816.  
  2817.  
  2818.  
  2819. Masked
  2820.     movem.l d4/a2,-(sp)
  2821.     move.l    d0,d4             ; data mask
  2822.     lea    (SP0point+12,sp),a3  ; bm_Planes for tmp bitmap on stack
  2823.     moveq    #1,d0             ; only 1 word to do
  2824.     bsr.b    mask8p
  2825.     move.l    d4,d7             ; converted data mask
  2826.     not.l    d4             ; dst bitmap mask
  2827.     move.l    d5,d6
  2828.     lea    (mDP0point+12,sp),a3  ; bm_Planes for dst bitmap  stacked a4
  2829.     lea    (SP0+12,sp),a1         ; load next tmp plane ptr
  2830.  
  2831. 10$    move.l    (a1)+,d0       ; we use       temp read
  2832.     move.l    (a3)+,d1       ; load next dst plane ptr
  2833.     beq.b    20$           ; masked out, so skip
  2834.     move.l    d1,a0
  2835.     adda.l    d2,a0           ; move fwd/back in bitmap to align correctly
  2836.     move.l    (a0),d1        ; 32bit reads   dest read
  2837.     and.l    d7,d0           ; mask out unneeded converted data
  2838.     and.l    d4,d1           ; mask out just where we'll write
  2839.     or.l    d0,d1           ; stick'em together
  2840.     move.l    d1,(a0)        ; 32bit writes
  2841. 20$    dbf    d6,10$
  2842.     movem.l (sp)+,d4/a2
  2843.     rts
  2844.     cnop    0,4
  2845.  
  2846.  
  2847.  
  2848. mask8p
  2849.     movem.l d2/d4/d5/a2,-(sp)
  2850.     move.l    a0,a5
  2851.     lsl.l    #5,d0
  2852.     add.l    d0,a5
  2853.  
  2854.     cmpi.b    #4,d5
  2855.     blt.w    mask4p        ; if it's =<4 planes skip the upper 4
  2856.  
  2857.     movem.l a0/a3,-(sp)
  2858.     movem.l (16,a3),a1-a4
  2859.     move.l    #$33333333,d5
  2860.     move.l    #$55555555,d6
  2861.     move.l    #$F0F0F0F0,d4
  2862.     move.l    (a0)+,d0
  2863.     move.l    (a0)+,d2
  2864.     move.l    (a0)+,d1
  2865.     move.l    (a0)+,d3
  2866.     and.l    d4,d0
  2867.     and.l    d4,d2
  2868.     lsr.l    #4,d2
  2869.     or.l    d2,d0
  2870.     and.l    d4,d1
  2871.     and.l    d4,d3
  2872.     lsr.l    #4,d3
  2873.     or.l    d3,d1
  2874.     move.l    d4,d2
  2875.     move.l    d4,d3
  2876.     move.l    d4,d7
  2877.     and.l  (a0)+,d2
  2878.     and.l  (a0)+,d4
  2879.     and.l  (a0)+,d3
  2880.     and.l  (a0)+,d7
  2881.     lsr.l    #4,d4
  2882.     or.l    d4,d2
  2883.     lsr.l    #4,d7
  2884.     or.l    d7,d3
  2885.     move.l    d2,d7
  2886.     move.l    d3,d4
  2887.     move.w    d0,d2
  2888.     move.w    d1,d3
  2889.     swap    d2
  2890.     swap    d3
  2891.     move.w    d2,d0
  2892.     move.w    d3,d1
  2893.     move.w    d7,d2
  2894.     move.w    d4,d3
  2895.     bra.b    m8p_2
  2896.     cnop    0,4
  2897.  
  2898.  
  2899. m8p_1    move.l    (a0)+,d0
  2900.     move.l    (a0)+,d2
  2901.     move.l    (a0)+,d1
  2902.     move.l    (a0)+,d3
  2903.  
  2904.     tst.l    a2
  2905.     beq.b    10$
  2906.     move.l    d4,(a2)+  ;p5
  2907.  
  2908. 10$    move.l    #$F0F0F0F0,d4
  2909.     and.l    d4,d0
  2910.     and.l    d4,d2
  2911.     lsr.l    #4,d2
  2912.     or.l    d2,d0
  2913.     and.l    d4,d1
  2914.     and.l    d4,d3
  2915.     lsr.l    #4,d3
  2916.     or.l    d3,d1
  2917.     move.l    d4,d2
  2918.     move.l    d4,d3
  2919.     and.l  (a0)+,d2
  2920.     and.l  (a0)+,d3
  2921.     lsr.l    #4,d3
  2922.     or.l    d3,d2
  2923.     move.l    d4,d3
  2924.     and.l  (a0)+,d3
  2925.     and.l  (a0)+,d4
  2926.  
  2927.     tst.l    a3
  2928.     beq.b    20$
  2929.     move.l    d7,(a3)+  ;p6
  2930.  
  2931. 20$    lsr.l    #4,d4
  2932.     or.l    d4,d3
  2933.     move.l    d2,d7
  2934.     move.l    d3,d4
  2935.     move.w    d0,d2
  2936.     move.w    d1,d3
  2937.     swap    d2
  2938.     swap    d3
  2939.     move.w    d2,d0
  2940.     move.w    d3,d1
  2941.     move.w    d7,d2
  2942.     move.w    d4,d3
  2943.  
  2944.     tst.l    a1
  2945.     beq.b    m8p_2
  2946.     move.l    a6,(a1)+  ;p4
  2947.  
  2948.  
  2949. m8p_2
  2950.     move.l    d2,d4
  2951.     move.l    d3,d7
  2952.     lsr.l    #2,d4
  2953.     lsr.l    #2,d7
  2954.     eor.l    d0,d4
  2955.     eor.l    d1,d7
  2956.     and.l    d5,d4
  2957.     and.l    d5,d7
  2958.     eor.l    d4,d0
  2959.     eor.l    d7,d1
  2960.     lsl.l    #2,d4
  2961.     lsl.l    #2,d7
  2962.     eor.l    d4,d2
  2963.     eor.l    d7,d3
  2964.  
  2965.     move.l    #$00ff00ff,d4
  2966.     move.l    d1,d7
  2967.     lsr.l    #8,d7
  2968.     eor.l    d0,d7
  2969.     and.l    d4,d7
  2970.     eor.l    d7,d0
  2971.     lsl.l    #8,d7
  2972.     eor.l    d7,d1
  2973.  
  2974.     move.l    d1,d7
  2975.     lsr.l    #1,d7
  2976.     eor.l    d0,d7
  2977.     and.l    d6,d7
  2978.     eor.l    d7,d0
  2979.  
  2980.     tst.l    a4
  2981.     beq.b    10$
  2982.     move.l    d0,(a4)+  ;p7
  2983.  
  2984. 10$    add.l    d7,d7
  2985.     eor.l    d1,d7
  2986.  
  2987.     move.l    d3,d1
  2988.     lsr.l    #8,d1
  2989.     eor.l    d2,d1
  2990.     and.l    d4,d1
  2991.     eor.l    d1,d2
  2992.     lsl.l    #8,d1
  2993.     eor.l    d1,d3
  2994.  
  2995.     move.l    d3,d1
  2996.     lsr.l    #1,d1
  2997.     eor.l    d2,d1
  2998.     and.l    d6,d1
  2999.     eor.l    d1,d2
  3000.     movea.l d2,d4
  3001.     add.l    d1,d1
  3002.     eor.l    d1,d3
  3003.     movea.l d3,a6
  3004.     cmpa.l    a0,a5
  3005.     bgt    m8p_1
  3006.  
  3007.     tst.l    a3
  3008.     beq.b    20$
  3009.     move.l    d7,(a3)   ;p6
  3010.  
  3011. 20$    tst.l    a1
  3012.     beq.b    30$
  3013.     move.l    a6,(a1)   ;p4
  3014.  
  3015. 30$    tst.l    a2
  3016.     beq.b    40$
  3017.     move.l    d4,(a2)   ;p5
  3018.  
  3019. 40$    movem.l (sp)+,a0/a3
  3020.  
  3021. mask4p
  3022.     movem.l (a3),a1-a4
  3023.     ;
  3024.     ; lower 4 planes
  3025.     ;
  3026.     move.l    #$33333333,d5
  3027.     move.l    #$55555555,d6
  3028.     move.l    #$0F0F0F0F,d4
  3029.     move.l    (a0)+,d0
  3030.     move.l    (a0)+,d2
  3031.     move.l    (a0)+,d1
  3032.     move.l    (a0)+,d3
  3033.     and.l    d4,d0
  3034.     and.l    d4,d2
  3035.     lsl.l    #4,d0
  3036.     or.l    d2,d0
  3037.     and.l    d4,d1
  3038.     and.l    d4,d3
  3039.     lsl.l    #4,d1
  3040.     or.l    d3,d1
  3041.     move.l    d4,d2
  3042.     move.l    d4,d3
  3043.     move.l    d4,d7
  3044.     and.l  (a0)+,d2
  3045.     and.l  (a0)+,d4
  3046.     and.l  (a0)+,d3
  3047.     and.l  (a0)+,d7
  3048.     lsl.l    #4,d2
  3049.     or.l    d4,d2
  3050.     lsl.l    #4,d3
  3051.     or.l    d7,d3
  3052.     move.l    d2,d7
  3053.     move.l    d3,d4
  3054.     move.w    d0,d2
  3055.     move.w    d1,d3
  3056.     swap    d2
  3057.     swap    d3
  3058.     move.w    d2,d0
  3059.     move.w    d3,d1
  3060.     move.w    d7,d2
  3061.     move.w    d4,d3
  3062.     bra.b    m4p_2
  3063.     cnop    0,4
  3064.  
  3065.  
  3066. m4p_1    move.l    (a0)+,d0
  3067.     move.l    (a0)+,d2
  3068.     move.l    (a0)+,d1
  3069.     move.l    (a0)+,d3
  3070.  
  3071.     tst.l    a2
  3072.     beq.b    10$
  3073.     move.l    d4,(a2)+      ;p1
  3074.  
  3075. 10$    move.l    #$0F0F0F0F,d4
  3076.     and.l    d4,d0
  3077.     and.l    d4,d2
  3078.     lsl.l    #4,d0
  3079.     or.l    d2,d0
  3080.     and.l    d4,d1
  3081.     and.l    d4,d3
  3082.     lsl.l    #4,d1
  3083.     or.l    d3,d1
  3084.     move.l    d4,d2
  3085.     move.l    d4,d3
  3086.     and.l  (a0)+,d2
  3087.     and.l  (a0)+,d3
  3088.     lsl.l    #4,d2
  3089.     or.l    d3,d2
  3090.     move.l    d4,d3
  3091.     and.l  (a0)+,d3
  3092.     and.l  (a0)+,d4
  3093.  
  3094.     tst.l    a3
  3095.     beq.b    20$
  3096.     move.l    d7,(a3)+  ;p2
  3097.  
  3098. 20$    lsl.l    #4,d3
  3099.     or.l    d4,d3
  3100.     move.l    d2,d7
  3101.     move.l    d3,d4
  3102.     move.w    d0,d2
  3103.     move.w    d1,d3
  3104.     swap    d2
  3105.     swap    d3
  3106.     move.w    d2,d0
  3107.     move.w    d3,d1
  3108.     move.w    d7,d2
  3109.     move.w    d4,d3
  3110.  
  3111.     tst.l    a1
  3112.     beq.b    m4p_2
  3113.     move.l    a6,(a1)+ ;p0
  3114.  
  3115.  
  3116. m4p_2
  3117.     move.l    d2,d4
  3118.     move.l    d3,d7
  3119.     lsr.l    #2,d4
  3120.     lsr.l    #2,d7
  3121.     eor.l    d0,d4
  3122.     eor.l    d1,d7
  3123.     and.l    d5,d4
  3124.     and.l    d5,d7
  3125.     eor.l    d4,d0
  3126.     eor.l    d7,d1
  3127.     lsl.l    #2,d4
  3128.     lsl.l    #2,d7
  3129.     eor.l    d4,d2
  3130.     eor.l    d7,d3
  3131.  
  3132.     move.l    #$00ff00ff,d4
  3133.     move.l    d1,d7
  3134.     lsr.l    #8,d7
  3135.     eor.l    d0,d7
  3136.     and.l    d4,d7
  3137.     eor.l    d7,d0
  3138.     lsl.l    #8,d7
  3139.     eor.l    d7,d1
  3140.  
  3141.     move.l    d1,d7
  3142.     lsr.l    #1,d7
  3143.     eor.l    d0,d7
  3144.     and.l    d6,d7
  3145.     eor.l    d7,d0
  3146.  
  3147.     tst.l    a4
  3148.     beq.b    10$
  3149.     move.l    d0,(a4)+  ;p3
  3150.  
  3151. 10$    add.l    d7,d7
  3152.     eor.l    d1,d7
  3153.  
  3154.     move.l    d3,d1
  3155.     lsr.l    #8,d1
  3156.     eor.l    d2,d1
  3157.     and.l    d4,d1
  3158.     eor.l    d1,d2
  3159.     lsl.l    #8,d1
  3160.     eor.l    d1,d3
  3161.  
  3162.     move.l    d3,d1
  3163.     lsr.l    #1,d1
  3164.     eor.l    d2,d1
  3165.     and.l    d6,d1
  3166.     eor.l    d1,d2
  3167.     movea.l d2,d4
  3168.     add.l    d1,d1
  3169.     eor.l    d1,d3
  3170.     movea.l d3,a6
  3171.     cmpa.l    a0,a5
  3172.     bgt    m4p_1
  3173.  
  3174.     tst.l    a3
  3175.     beq.b    20$
  3176.     move.l    d7,(a3)  ;p2
  3177.  
  3178. 20$    tst.l    a1
  3179.     beq.b    30$
  3180.     move.l    a6,(a1)  ;p0
  3181.  
  3182. 30$    tst.l    a2
  3183.     beq.b    40$
  3184.     move.l    d4,(a2)  ;p1
  3185.  
  3186. 40$    movem.l (sp)+,d2/d4/d5/a2
  3187.     rts
  3188.     cnop    0,4
  3189.  
  3190.  
  3191.  
  3192. endpatch
  3193.  
  3194.  
  3195.  
  3196.  
  3197.